MVC Параметр запроса запроса - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу переопределить Azure AD SSO логин для MVC веб-приложения. Я не хочу выходить из приложения в процессе, но требую входа в систему в целях безопасности. Я использую OAuth2.0 с OID C через Owin для аутентификации.

Я пытаюсь использовать параметр запроса prompt = login, что теоретически должно помочь. Я нашел ссылку на Github, которая недавно стала доступна в Core, но не могу отследить, как это сделать в MVC5.2

Возможно ли это сделать в Application Builder? Я пытался добавить .WithExtraQueryParameters ("prompt=login") к ConfidentialClientApplicationBuilder при получении кода доступа. Не повезло.

Есть ли другой обходной путь, если код не выходит из коробки?

РЕДАКТИРОВАТЬ: PublicClientApplication позволяет .WithPrompt(Prompt.Login) в то время как ConfidentialClientApplication не позволяет (также не разрешает AcquireTokenInteractive). Это веб-приложение, поэтому ему необходим конфиденциальный конструктор. Протестировано с помощью компоновщика Publi c, и он успешно входит в систему. Но я получаю ошибку инстанцирования ActiveX «не в однопоточной квартире» (?) Странно, разве что так может быть доставлен токен. Я также проверил, переключившись на мультитенант в Azure и включив и выключив клиент Publi c.

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 30 апреля 2020

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

ForceLogin: позволяет разработчику приложения запрашивать учетные данные у службы даже если это не понадобится. Это может быть полезно в случае сбоя получения токена, чтобы позволить пользователю повторно войти в систему. Это делается путем отправки prompt=login поставщику удостоверений. Опять же, мы видели, что он используется в некоторых приложениях, ориентированных на безопасность, где руководство организации требует, чтобы пользователь повторно входил в систему при каждом обращении к c части приложения.

Итак, используйте код, указанный ниже:

result = await app.AcquireTokenInteractive(scopes)
                  .WithPrompt(Prompt.ForceLogin)
                  .ExecuteAsync();
0 голосов
/ 05 мая 2020

Я в итоге решил это следующим образом: В разделе Уведомления в ConfigureAuth(IAppBuilder app) добавьте ссылку на новое задание: RedirectToIdentityProvider = OnRedirectToIdentityProvider,
Затем добавьте задание:

private Task OnRedirectToIdentityProvider(RedirectToIdentityProviderNotification
<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> notification) 
     {             
         // Forces the user to login. 
         if (notification.ProtocolMessage.Prompt == null) 
         { 
             notification.ProtocolMessage.Prompt = "login";                 
         } 
         return Task.FromResult(0); 
     }

Надеюсь, что поможет следующему человек с этим вопросом.

0 голосов
/ 30 апреля 2020

Модификатор .WithExtraQueryParameters вам не поможет. Вы должны использовать .WithPrompt вместо этого. Пожалуйста, обратитесь статья .

Пример:

await PublicClientApplication
                    .AcquireTokenInteractive(scopes, null)
                    .WithAccount(CurrentUser)
                    .WithPrompt(Prompt.ForceLogin)      // use login for your case       
                    .ExecuteAsync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...