MVC提示查询参数



我想覆盖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中更改为多租户,并通过打开和关闭公共客户端进行了测试。

有什么想法吗?

您可以使用ForceLoginConfidentialClientApplicationBuilder添加参数。

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); 
}

希望这能帮助下一个人解决这个问题。

最新更新