我想覆盖MVC web应用程序的Azure AD SSO登录。在此过程中,我不想将其他应用程序注销,但出于安全目的,我需要登录。我通过Owin使用OAuth2.0和OIDC进行身份验证。
我正在尝试使用prompt=login查询参数,从理论上讲,这个参数应该可以完成任务。我发现最近在Core中提供了一个Github引用,但无法在MVC5.2 中跟踪如何做到这一点
是否可以在应用程序生成器中执行此操作?在获取访问代码时,我尝试将.WithExtraQueryParameters ("prompt=login")
添加到ConfidentialClientApplicationBuilder
。运气不好。
如果代码没有开箱即用,还有其他解决方法吗?
EDIT:PublicClientApplication
允许.WithPrompt(Prompt.Login)
,而ConfidentialClientApplication
不允许(也不允许AcquireTokenInteractive
(这是一个web应用程序,因此需要机密生成器。使用公共生成器进行了测试,并成功登录。但我得到了一个ActiveX实例化错误"不在单线程单元中"(?(奇怪,除非令牌是这样传递的。我还通过在Azure中更改为多租户,并通过打开和关闭公共客户端进行了测试。
有什么想法吗?
您可以使用ForceLogin
向ConfidentialClientApplicationBuilder
添加参数。
ForceLogin
:使应用程序开发人员能够让服务提示用户输入凭据,即使不需要。如果获取令牌失败,让用户重新登录,这将非常有用这是通过向身份提供者发送prompt=login
来完成的我们再次看到它在一些以安全为重点的应用程序中使用,在这些应用程序中,组织治理要求用户每次访问应用程序的特定部分时都重新登录。
因此,使用以下代码:
result = await app.AcquireTokenInteractive(scopes)
.WithPrompt(Prompt.ForceLogin)
.ExecuteAsync();
修饰符.WithExtraQueryParameters
对您没有帮助。您需要使用.WithPrompt
。请参阅文章。
示例:
await PublicClientApplication
.AcquireTokenInteractive(scopes, null)
.WithAccount(CurrentUser)
.WithPrompt(Prompt.ForceLogin) // use login for your case
.ExecuteAsync();
我最终解决了这个问题,如下所示:在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);
}
希望这能帮助下一个人解决这个问题。