我们已将客户端应用程序配置为通过OpenID Connect协议使用IdentityServer3身份验证(它是使用OWIN中间件支持OIDC的ASP.NET MVC应用程序)。
IdentityServer3本身配置为使用本地登录和外部登录(例如Azure AD)。
在常规流程中,一旦App需要对用户进行身份验证,它会将其重定向到IdentityServer3登录屏幕 - 它没问题。但在某些情况下,基于每个请求,我想以某种方式绕过登录屏幕,让IdentityServer3知道用户想立即登录特定的外部身份提供商。
这可能吗?
答案 0 :(得分:18)
刚刚在IdentityServer3's Authorization/Authentication Endpoint documentation中找到了解决方案!
acr_values(可选)允许传递相关的其他身份验证 用户服务的信息 - 还有特殊的值 含义: idp:name_of_idp绕过login / home领域屏幕和 将用户直接转发给选定的身份提供商(如果 允许每个客户端配置)租户:name_of_tenant可用于 将租户名称传递给用户服务
如何使用OWIN OpenID Connect中间件传递其他参数:https://katanaproject.codeplex.com/workitem/325
以下是授权请求的示例:
答案 1 :(得分:7)
我知道这已经过时了,但我想如果他们想要自动重定向到外部登录,我仍然可以帮助他人:
public override Task PreAuthenticateAsync(PreAuthenticationContext context)
{
context.SignInMessage.IdP = "windows";
return base.PreAuthenticateAsync(context);
}
您基本上可以覆盖UserServiceBase上的PreAuthenticateAsync,并将context.SignInMessage上的属性IdP更改为已在启动时设置的外部提供程序名称。这将重定向。
答案 2 :(得分:0)
使用外部提供程序配置identtyserver时,通常在AuthenticationOptions中将AutheticationType
设置为某个字符串。像下面一样
app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions
{
AuthenticationType = "Google",
Caption = "Sign-in with Google",
SignInAsAuthenticationType = signInAsType,
ClientId = ConfigurationManager.AppSettings["google:clientid"],
ClientSecret = ConfigurationManager.AppSettings["google:clientsecret"],
});
然后在客户端应用程序中,您可以将acrvalues
设置为Authentication-type,如下所示
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Notifications = new OpenIdConnectAuthenticationNotifications
{
RedirectToIdentityProvider = (n) =>
{
if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.AuthenticationRequest)
{
if(n.Request.Uri == "someurl")
{
//set acrvalues. the value of the `idp`, (which is `Google` in this case) must match with the `AutheticationType` you set in IdentityServer
n.ProtocolMessage.AcrValues = "idp:Google";
}
}
return Task.FromResult(0);
}
}
还要注意,idp
值区分大小写。
另一个选项(我没有尝试过)。无需设置idp
,而是在客户端应用程序中设置tenant
。
n.ProtocolMessage.AcrValues = "tenant:" + n.Request.Uri.ToString();
正如@TheRock所述,在IndentityServer中检查SignInMessage
中的租户并覆盖Idp
public override Task PreAuthenticateAsync(PreAuthenticationContext context)
{
if(context.SignInMessage.Tenant = "sometenant")
{
context.SignInMessage.IdP = "Google";
return base.PreAuthenticateAsync(context);
}
}
通过这种方式,当您继续添加新的外部提供程序时,不必在客户端应用程序中更改代码。您仅更新IndentityServer代码。如果您有多个客户端应用程序连接到同一身份服务器,则这特别有用。