Аутентификация с использованием Azure AD, успешно выполнена с запросом GET вручную, но не удается с приложением .net framework

#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.

Вы можете найти свой тип приложения на портале azure. введите описание изображения здесь

Комментарии:

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.