当前位置: 首页 > 知识库问答 >
问题:

如何在identity server 3中为Sustainsys外部提供程序设置acr值

公冶翰池
2023-03-14

我在SQL中拥有本地用户帐户的Idsvr3。此外,我还使用配置了支持SAML2的外部标识提供程序https://github.com/Sustainsys/Saml2我在这里跟踪了样本

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

我想改变这种行为。我希望用户直接转到外部登录基于某些条件。我已经读到,我可以将所需的登录提供程序传递给acr\U值,IdSvr3将直接转到外部提供程序。

下面是我如何向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);
                    }
                }                
            });
        }        
    }

但是,identity server引发错误外部登录错误:提供程序请求的saml2不是配置的外部提供程序

Sustainsys/Saml2提供程序的有效名称是什么?在哪里配置?

共有1个答案

诸葛立果
2023-03-14

我想我找到了。idp实际上是AuthenticationType属性的值。在IdentityServer3中设置外部提供程序期间,默认情况下,Saml2AuthenticationOptions将AuthenticationType设置为Saml2。因此,在客户端应用程序中,我必须使用与acr值完全相同的值,它区分大小写。我用的是小写字母,而不是大写字母。当我更改为Saml2时,它工作了。

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

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

在第2.5.4节第3步:使用新的身份提供程序配置您的身份服务器中,查看okta是如何配置IdentityServer3的

还可以从IdentityServer文档中获得

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

 类似资料:
  • 我正试图在应用程序处于退出状态时从firebase保存一个通知到redux。 但是我需要在app.js中这样做,当我甚至不在组件上时,我如何分派redux操作呢? 这就是我要做的

  • 我有两个密钥保护实例,A 是 B 的 IdP。从B的登录屏幕中,这按预期工作。但是,我无法让 IDP 启动的 SSO 从 A 到 B 工作。我在 A 中用一个名称(比如“bbbbb”)填充了“IDP 启动的 SSO URL 名称”字段。当我尝试导航到:http://aaaaa/auth/realms/his/protocol/saml/clients/bbbbb 我总是以以下日志记录结束: 22:

  • 我正在使用Firebase匿名登录制作一个Flutter应用程序(稍后我将添加其他登录方法)。我想创建流和提供程序,以便如果用户点击“登录”按钮,它会将用户带到Home(),如果用户点击Home()中的“注销”按钮,则会将其带到Login()页面。 我还想为应用程序重新启动执行此操作,例如当用户之前登录时,应将用户直接带到Home()页面而不是Login()。 我对这一切有非常基本的了解。在这里,

  • 问题内容: 我当然缺少有关喷油器的一些基本知识,但是我无法理解为什么 还有这个 按预期工作,而这 会抛出 错误:[$ injector:unpr]未知提供程序:$ provideProvider <-$ provide 如下所述,与提供者有一些特殊的关系,而与实例打交道时,我不确定使块如此特别的东西。 结果,是否没有办法到达外部块,例如,使用(尽管似乎也获得了提供者实例)? 除了好奇心外,这个问题

  • 这就是我如何注册我的应用程序来接收位置更新: 我悬而未决的意图几乎在所要求的时间间隔内被后台调用... 到目前为止还好。 问题:当WIFI被禁用/没有连接到任何网络,或者当没有3G/4G网络数据启用-融合位置提供商没有提供新的位置更新!! 我的位置访问设置打开,并检查GPS卫星和WI-FI和移动网络位置。 更大的问题是:有时在这种情况下,我确实通过挂起的意图接收位置更新回调,但它知道最后的位置(即