2016-10-07 64 views
0

我正在使用身份服务器3与ASP.NET身份作为其用户存储。我遵循这个article来设置IdentityServer,我的客户端是一个ASP MVC Web应用程序。我可以从我的客户端登录,但我不明白如何在客户端获取用户信息。在使用服务器端的即时通讯:IdentityServer 3和ASP.NET身份:如何获取用户信息

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); 
        } 
       } 

,但我不能获得有关用户的信息通过电子邮件发送的例子。

回答

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>(); 
相关问题