Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 在登录时循环自定义声明-Asp.net核心_Asp.net Core_Identityserver4_Identityserver3 - Fatal编程技术网

Asp.net core 在登录时循环自定义声明-Asp.net核心

Asp.net core 在登录时循环自定义声明-Asp.net核心,asp.net-core,identityserver4,identityserver3,Asp.net Core,Identityserver4,Identityserver3,我们的ASP.NET MVC应用程序通过以下配置连接到IdentityServer 3,并能够访问所有自定义声明 app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions { Authority = IdentityServerUrl, ClientId = IdentityClientId,

我们的ASP.NET MVC应用程序通过以下配置连接到IdentityServer 3,并能够访问所有自定义声明

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
            {
                Authority = IdentityServerUrl,
                ClientId = IdentityClientId,                              
                ResponseType = "id_token token",
                Scope = "openid profile myScope",
                SignInAsAuthenticationType = "Cookies",

                Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    SecurityTokenValidated = async n =>
                    {
                        var newIdentity = new ClaimsIdentity(
                            n.AuthenticationTicket.Identity.AuthenticationType,
                            "name",
                            "myrole");

                        var userInfoClient = new UserInfoClient(
                            new Uri(n.Options.Authority + "/connect/userinfo"),
                            n.ProtocolMessage.AccessToken);

                        var userInfo = await userInfoClient.GetAsync();
                        userInfo.Claims.ToList().ForEach(ui => newIdentity.AddClaim(new Claim(ui.Item1, ui.Item2)));

                        var sid = n.AuthenticationTicket.Identity.Claims.FirstOrDefault(x => x.Type == "sid");
                        if (sid != null)
                        {
                            newIdentity.AddClaim(new Claim("sid", sid.Value));
                        }

                        n.AuthenticationTicket = new AuthenticationTicket(
                            newIdentity,
                            n.AuthenticationTicket.Properties);
                    }
                }
            });
.AddOpenIdConnect("oidc", options =>
                {
                    options.Authority = IdentityClientUrl;
                    options.ClientId = IdentityClientId;
                    options.ResponseType = OpenIdConnectResponseType.IdTokenToken;
                    options.Scope.Clear();
                    options.Scope.Add("profile");
                    options.Scope.Add("openid");
                    options.Scope.Add("email");
                    options.Scope.Add("myScope");

                    options.GetClaimsFromUserInfoEndpoint = true;

                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        NameClaimType = "name",
                        RoleClaimType = "myrole"
                    };

                    options.SaveTokens = true;
                    options.ClaimActions.MapUniqueJsonKey("myrole", "myrole", "string");          
                });
现在我们要升级并连接到带有.net core的IdentityServer 3

我们尝试了下面的代码,但我不确定如何遍历所有自定义声明

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
            {
                Authority = IdentityServerUrl,
                ClientId = IdentityClientId,                              
                ResponseType = "id_token token",
                Scope = "openid profile myScope",
                SignInAsAuthenticationType = "Cookies",

                Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    SecurityTokenValidated = async n =>
                    {
                        var newIdentity = new ClaimsIdentity(
                            n.AuthenticationTicket.Identity.AuthenticationType,
                            "name",
                            "myrole");

                        var userInfoClient = new UserInfoClient(
                            new Uri(n.Options.Authority + "/connect/userinfo"),
                            n.ProtocolMessage.AccessToken);

                        var userInfo = await userInfoClient.GetAsync();
                        userInfo.Claims.ToList().ForEach(ui => newIdentity.AddClaim(new Claim(ui.Item1, ui.Item2)));

                        var sid = n.AuthenticationTicket.Identity.Claims.FirstOrDefault(x => x.Type == "sid");
                        if (sid != null)
                        {
                            newIdentity.AddClaim(new Claim("sid", sid.Value));
                        }

                        n.AuthenticationTicket = new AuthenticationTicket(
                            newIdentity,
                            n.AuthenticationTicket.Properties);
                    }
                }
            });
.AddOpenIdConnect("oidc", options =>
                {
                    options.Authority = IdentityClientUrl;
                    options.ClientId = IdentityClientId;
                    options.ResponseType = OpenIdConnectResponseType.IdTokenToken;
                    options.Scope.Clear();
                    options.Scope.Add("profile");
                    options.Scope.Add("openid");
                    options.Scope.Add("email");
                    options.Scope.Add("myScope");

                    options.GetClaimsFromUserInfoEndpoint = true;

                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        NameClaimType = "name",
                        RoleClaimType = "myrole"
                    };

                    options.SaveTokens = true;
                    options.ClaimActions.MapUniqueJsonKey("myrole", "myrole", "string");          
                });
在现有方法中,我能够从userInfo获取所有声明,因此我可以循环并添加所有内容。 在asp.net核心中-但是我可以使用索赔来映射它们,每次一个电话。有没有什么方法我可以循环通过所有它们并添加它们-比如说我不知道索赔类型


有什么帮助吗?

您可以尝试使用MapAllExcept方法映射所有声明,如:

options.ClaimActions.MapAllExcept("iss", "nbf", "exp", "aud", "nonce");