跳过IdentityServer3登录屏幕

时间:2015-04-29 12:37:34

标签: openid thinktecture-ident-server openid-connect thinktecture identityserver3

我们已将客户端应用程序配置为通过OpenID Connect协议使用IdentityServer3身份验证(它是使用OWIN中间件支持OIDC的ASP.NET MVC应用程序)。

IdentityServer3本身配置为使用本地登录和外部登录(例如Azure AD)。

在常规流程中,一旦App需要对用户进行身份验证,它会将其重定向到IdentityServer3登录屏幕 - 它没问题。但在某些情况下,基于每个请求,我想以某种方式绕过登录屏幕,让IdentityServer3知道用户想立即登录特定的外部身份提供商。

这可能吗?

image

3 个答案:

答案 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

以下是授权请求的示例:

sample request

答案 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代码。如果您有多个客户端应用程序连接到同一身份服务器,则这特别有用。