2

thisIdentityServer4に基づいて、基本的な Web API 保護を既に実装しています。

デモはメモリ内データに基づいています。また、ほとんどのチュートリアルは、ユーザー データの EF Core 実装に基づいています。検索したところ、現在バージョン 4 で欠落している がIUserServiceありました。IdentityServer3

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

EF6 ストアからユーザー データを取得するにはどうすればよいですか?

4

1 に答える 1

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);
    }
}
于 2016-08-08T16:53:04.640 に答える