IdentityServer 3和ASP.NET Identity:如何获取用户信息

时间:2016-10-07 11:35:21

标签: asp.net-mvc asp.net-identity identityserver3

我使用带有ASP.NET Identity的IdentityServer 3作为其用户存储。我已按照此article设置IdentityServer,我的客户端是ASP MVC Web应用程序。我可以从我的客户端登录,但我不了解如何在客户端获取用户信息。在服务器端我使用:

 var scopes = new Scope[]
            {
                StandardScopes.OpenId,
                StandardScopes.Email,
                new Scope
                {
                    Name = "roles",
                    Claims = new List<ScopeClaim>
                    {
                        new ScopeClaim("role")
                    }
                }

            };

            var clients = new Client[] 
            {
                new Client
                {
                    ClientId = "mvc-demo",
                    ClientName = "MVC Demo Client",
                    Flow = Flows.Implicit,
                    RedirectUris = new List<string>
                    {
                        "http://localhost:16652/"
                    },
                    AllowedScopes = new List<string>
                    {
                        "openid", "email", "roles"
                    }
                }
            };

            var factory = new IdentityServerServiceFactory().Configure(connectionString);
            factory.UseInMemoryClients(clients);
            factory.UseInMemoryScopes(scopes);

在客户端:

 app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
            {
                AuthenticationType = "oidc",
                SignInAsAuthenticationType = "cookies",
                Authority = "https://localhost:44305/",
                ClientId = "mvc-demo",
                RedirectUri = "http://localhost:16652/",
                ResponseType = "id_token token",
                Scope = "openid email roles",

                Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    SecurityTokenValidated = n =>
                    {
                        var id = n.AuthenticationTicket.Identity;

                        var email = id.FindFirst(Constants.ClaimTypes.Email);
                        var roles = id.FindAll(Constants.ClaimTypes.Role);

                        // create new identity and set name and role claim type
                        var nid = new ClaimsIdentity(
                            id.AuthenticationType,
                            Constants.ClaimTypes.Email,
                            Constants.ClaimTypes.Role);

                        nid.AddClaim(email);
                        nid.AddClaims(roles);

                        // add some other app specific claim
                        //nid.AddClaim(new Claim("app_specific", "some data"));

                        n.AuthenticationTicket = new AuthenticationTicket(
                            nid,
                            n.AuthenticationTicket.Properties);

                        return Task.FromResult(0);
                    }
                }

但我无法获得有关用户电子邮件的信息。

1 个答案:

答案 0 :(得分:0)

我设法以这种方式向我的客户端应用程序发送声明:

var scopes = new Scope[]
            {
                StandardScopes.OpenId,
                new Scope
                {
                    Name = "roles",
                    Type = ScopeType.Identity,
                    Claims = new List<ScopeClaim>
                    {
                        new ScopeClaim("role")
                    }
                },
                new Scope
                {
                    Name = "email",
                    Type = ScopeType.Identity,
                    Claims = new List<ScopeClaim>
                    {
                        new ScopeClaim(Constants.ClaimTypes.Email)
                    }
                }

            };

            var clients = new Client[] 
            {
                new Client
                {
                    ClientId = "mvc-demo",
                    ClientName = "MVC Demo Client",
                    Flow = Flows.Implicit,
                    RedirectUris = new List<string>
                    {
                        "http://localhost:16652/"
                    },
                    AllowedScopes = new List<string>
                    {
                        "openid", "email", "roles"
                    }
                }
            };

在客户端,我需要关闭声明转换,正确获取它们,就像这样(在OWIN启动类中):

AntiForgeryConfig.UniqueClaimTypeIdentifier = Constants.ClaimTypes.Subject;
JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();