2

我已经基于this通过IdentityServer4实施了基本Web API保护。IdentityServer4与EF6

该演示基于内存数据。大部分教程都基于用户数据的EF Core实现。正如我搜索了。在IdentityServer3一个IUserService这是现在缺少版本4

builder.AddInMemoryClients(Clients.Get()); 
builder.AddInMemoryScopes(Scopes.Get()); 
builder.AddInMemoryUsers(Users.Get()); 

如何从一个EF6店取回我的用户数据?

回答

4

在Startup.cs,为此

builder.Services.AddTransient<IResourceOwnerPasswordValidator, ResourceOwnerPasswordValidator>(); 
builder.Services.AddTransient<IProfileService, ProfileService>(); 

这里是ResourceOwnerPasswordValidator样本,ProfileService

public class ResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator 
{ 
    private MyUserManager _myUserService { get; set; } 
    public ResourceOwnerPasswordValidator() 
    { 
     _myUserService = new MyUserManager(); 
    } 

    public async Task<CustomGrantValidationResult> ValidateAsync(string userName, string password, ValidatedTokenRequest request) 
    { 
     var user = await _myUserService.FindByNameAsync(userName); 
     if (user != null && await _myUserService.CheckPasswordAsync(user, password)) 
     { 
      return new CustomGrantValidationResult(user.EmailAddress, "password"); 
     } 
     return new CustomGrantValidationResult("Invalid username or password"); 
    } 
} 


public class ProfileService : IProfileService 
{ 
    MyUserManager _myUserManager; 
    public ProfileService() 
    { 
     _myUserManager = new MyUserManager(); 
    } 

    public async Task GetProfileDataAsync(ProfileDataRequestContext context) 
    { 
     var sub = context.Subject.FindFirst("sub")?.Value; 
     if (sub != null) 
     { 
      var user = await _myUserManager.FindByIdAsync(sub); 
      var cp = await getClaims(user); 

      var claims = cp.Claims; 
      if (context.AllClaimsRequested == false || 
       (context.RequestedClaimTypes != null && context.RequestedClaimTypes.Any())) 
      { 
       claims = claims.Where(x => context.RequestedClaimTypes.Contains(x.Type)).ToArray().AsEnumerable(); 
      } 

      context.IssuedClaims = claims; 
     } 
    } 

    public Task IsActiveAsync(IsActiveContext context) 
    { 
     return Task.FromResult(0); 
    } 

    private async Task<ClaimsPrincipal> getClaims(CustomerSite user) 
    { 
     if (user == null) 
     { 
      throw new ArgumentNullException(nameof(user)); 
     } 
     var userId = await _myUserManager.GetUserIdAsync(user); 
     var userName = await _myUserManager.GetUserNameAsync(user); 
     var id = new ClaimsIdentity(); 
     id.AddClaim(new Claim(JwtClaimTypes.Id, userId)); 
     id.AddClaim(new Claim(JwtClaimTypes.PreferredUserName, userName)); 

     var roles = await _myUserManager.GetRolesAsync(user); 
     foreach (var roleName in roles) 
     { 
      id.AddClaim(new Claim(JwtClaimTypes.Role, roleName));     
     } 

     id.AddClaims(await _myUserManager.GetClaimsAsync(user)); 

     return new ClaimsPrincipal(id); 
    } 
} 
+0

你能告诉我为什么 'GetProfileDataAsync' 没有在我的代码解雇而'ValidateAsync”叫做? –

+0

@MohsenAfsin不知道,在代码到达'GetProfileDataAsync'之前可能会发生异常? – sunil

+0

你可以给“IProfileService”和“IResourceOwnerPasswordValidator”做些什么吗? – Shimmy