#azure #authentication #active-directory #adal
#azure #аутентификация #active-directory #adal
Вопрос:
Я следую этому руководству (введите описание ссылки здесь), чтобы получить доступ к ресурсам Skype для бизнеса. Все идет нормально, когда я пытаюсь через Insomnia или Postman, но у меня не получается, когда я делаю это с моим приложением .net Framework. Сначала давайте посмотрим на ручной вызов: всякий раз, когда я делаю запрос GET, показанный на следующем рисунке, я перенаправляюсь на страницу входа в Microsoft, я вхожу в систему со своими учетными данными и взамен (в URL) я вижу токен аутентификации, который мне нужен для следующих шагов.
Теперь я пытаюсь добиться такого же поведения с помощью моего приложения .net Framework, но в нем говорится, что мне нужен секрет клиента, который я не использую при вызове вручную. Код приведен ниже:
Итак, приложение запускается, появляется окно для вставки моих учетных данных, я ввожу свое имя пользователя и пароль, а затем появляется следующая ошибка:
Может ли это быть связано с перенаправлением? В случае успешного выполнения ручного вызова после того, как я вставляю свои учетные данные, я перенаправляюсь на страницу, указанную в redirect_uri (что в моем случае не работает), но, по крайней мере, я получаю токен обратно, см. Изображение:
Комментарии:
1. Используете ли вы .net core? Я не могу использовать PromptBehavior в .net core, и это применимо к .net на основе документа. learn.microsoft.com/en-us/dotnet/api /…
2. @TonyJu вы определенно правы, приношу свои извинения. Я начал с разработки приложения .net core, но столкнулся с вашей той же проблемой и создал то же приложение, но на основе .net framework. Приведенный выше код действительно предназначен для .net Framework, мои извинения!
3. Все в порядке. Я добавил свой ответ, как показано ниже.
Ответ №1:
Если вы используете тип приложения webapp / api, вам необходимо передать clientSecret для получения токена. Вот пример кода.
var authContext = new AuthenticationContext(context.Options.Authority, new NaiveSessionCache(userObjectId, context.HttpContext.Session));
var credential = new ClientCredential(context.Options.ClientId, context.Options.ClientSecret);
var token2 = await authContext.AcquireTokenAsync(context.Options.Resource,credential);
Если вы не хотите передавать clientSecret для получения токена, вам необходимо использовать тип приложения NativeClient.
Комментарии:
1. Прежде всего, спасибо за ваш ответ, у меня есть пара вопросов, если возможно: 1) что это за userObjectId? 2) NaiveSessionCache является частью какого пакета nuget? К сожалению, я не могу его найти
2. userObjectId — это идентификатор пользователя, а NativeSessionCache — это общедоступный NaiveSessionCache (строковый идентификатор пользователя, ISession session) { UserObjectId = идентификатор пользователя; cacheId = UserObjectId «_TokenCache»; Session = сессия; это. AfterAccess = AfterAccessNotification; это. BeforeAccess = BeforeAccessNotification; Load(); } Вы можете загрузить образец здесь. github.com/Azure-Samples/… @Tarta
3. Если мой ответ полезен, пожалуйста, сделайте это в качестве ответа. Спасибо. @Tarta
4. Конечно, я выберу это в качестве ответа, но я все еще не могу заставить это работать. Использовали ли вы login.windows.net как полномочия?
5. Я еще раз проверил документ, если ваше приложение проходит аутентификацию на онлайн-сервере, вы должны следовать потоку авторизации Azure AD, как описано в этой статье. learn.microsoft.com/en-us/skype-sdk/ucwa/… Вы можете использовать код, который вы использовали ранее, и просто изменить тип приложения на native.