1

Idsvr3在 SQL 中有本地用户帐户。此外,我还使用https://github.com/Sustainsys/Saml2配置了支持 SAML2 的外部身份提供程序,我遵循了此处的示例

现在,当用户访问客户端应用程序时,他会被重定向到登录页面,该页面显示用于本地登录的用户 ID/密码文本框,还有一个用于重定向到外部提供商的按钮。

我想改变这种行为。我希望用户根据某些条件直接转到外部登录。我读过我可以将所需的登录提供程序传递给acr_valuesIdSvr3 将直接转到外部提供程序。

这是我注册外部提供商的方式IdSvr3 (注意,为简洁起见,删除了一些代码)

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Map("/identity", idsrvApp =>
        {
            var identityServerOptions = new IdentityServerOptions
            {
                AuthenticationOptions = new AuthenticationOptions()
                {                        
                }
                .Configure(ConfigureIdentityProviders),                    
            };

            idsrvApp.UseIdentityServer(identityServerOptions);
        });            
    }

    private void ConfigureIdentityProviders(IAppBuilder app, string signInAsType)
    {                           
            // SAML2
            var options = new Saml2AuthenticationOptions(false)
            {
                SPOptions = new SPOptions
                {
                    EntityId = new EntityId("https://localhost:44300/IdSrv3/Saml2"),
                },
                SignInAsAuthenticationType = signInAsType,
                Caption = "SAML2p"
            };

            UseIdSrv3LogoutOnFederatedLogout(app, options);

            options.SPOptions.ServiceCertificates.Add(new X509Certificate2(
                AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "/App_Data/Sustainsys.Saml2.Tests.pfx"));

            options.IdentityProviders.Add(new IdentityProvider(
                new EntityId("https://stubidp.sustainsys.com/Metadata"),
                options.SPOptions)
            {
                LoadMetadata = true
            });

            app.UseSaml2Authentication(options);            
    }
}

这是客户端应用程序启动

 public class Startup
    {
        public void Configuration(IAppBuilder app)
        {            
            app.UseCookieAuthentication(CK);

            app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
            {
                Authority = "https://localhost:44300/identity",
                Scope = "openid profile email",
                ClientId = "XXXXXXXXXXXXXXX",
                RedirectUri = "http://localhost:36102/",
                ResponseType = "id_token",
                SignInAsAuthenticationType = "Cookies",               

                Notifications = new OpenIdConnectAuthenticationNotifications
                {                    
                    RedirectToIdentityProvider = (n) =>
                    {
                        if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.AuthenticationRequest)
                        {
                           if(SomeCondition == true)
                           {
                              n.ProtocolMessage.AcrValues = "idp:saml2";
                           }
                        }

                        return Task.FromResult(0);
                    }
                }                
            });
        }        
    }

但是身份服务器抛出错误External login error: provider requested saml2 is not a configured external provider

提供者的有效名称Sustainsys/Saml2是什么,它在哪里配置?

4

1 回答 1

2

我想我找到了。这idp实际上是AuthenticationType财产的价值。在 IdentityServer3 中的外部提供程序设置期间,Saml2AuthenticationOptions默认情况下将 AutheticationType 设置为Saml2. 因此,在客户端应用程序中,我必须使用与 完全相同的值acr-values,它区分大小写。我使用的是 smalls而不是 capital S。当我改变Saml2它的工作。

我还可以将 AutheticationType 覆盖为我想要的任何字符串,这很好,因为现在我可以设置多个支持 SAML2 协议的外部 IdP 并通过它们的 AutheticationType 区分它们

我还发现此文档很有帮助 https://media.readthedocs.org/pdf/saml2/latest/saml2.pdf

看看如何IdentityServer3在部分配置 okta2.5.4 Step 3: Configure your identity server with the new identity provider

同样来自 IdentityServer文档

AuthenticationType 必须是唯一值以标识外部身份提供者。此值还将用于生成的令牌中的 idp 声明。此外,可以使用 acr_values 参数在授权/身份验证请求期间使用相同的值预先选择身份提供者(有关更多信息,请参阅此内容)。此值还用于限制客户端配置上允许的身份提供者。

于 2018-08-23T17:06:41.817 回答