web-dev-qa-db-ja.com

拡張MVCコアIDユーザーを使用したカスタムクレームの実装

MVC Core 2.0でカスタム承認クレームを作成して(AspNetCore.identityを使用)、カスタムユーザーのブールプロパティを確認するにはどうすればよいですか? IdentityUser(ApplicationUser)を拡張して、ブール値「IsDeveloper」を含めました。クレームベースの認証を使用していて、カスタムクレームを追加したいのですが、どこから始めればよいかわかりません。次のようなカスタムクレームを作成するにはどうすればよいですか。

  1. 現在の(カスタマイズされた)Core.Identityユーザーを見つけます。
  2. カスタムIDユーザーのブール値を評価しますか?

コアIDクレーム MSDN:クレームベース認証 は理解していますが、カスタムクレームは初めてなので、どこから始めればよいかわかりません。見つけたオンラインドキュメントが機能しないか、私のシナリオに適合しません。

10
davewilliams459

したがって、カスタムクレームをどこかに作成し、カスタムポリシーまたは手動で確認する必要があります。

1)カスタムクレームの追加

JwtBearer認証

あなたはこのようなことをすることができます:

Jwt-tokenを返すコントローラーアクションで、custom claimを追加できます。

[HttpGet]
public dynamic GetToken(string login, string password)
{
    var handler = new JwtSecurityTokenHandler();

    var sec = "12312313212312313213213123123132123123132132132131231313212313232131231231313212313213132123131321313213213131231231213213131311";
    var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(sec));
    var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature);

    var user = GetUserFromDb(login);
    var identity = new ClaimsIdentity(new GenericIdentity(user.Email), new[] { new Claim("user_id", user.Id) });
    if (user.IsDeveloper)
        identity.AddClaim(new Claim("IsDeveloper", "true"));
    var token = handler.CreateJwtSecurityToken(subject: identity,
                                                signingCredentials: signingCredentials,
                                                audience: "ExampleAudience",
                                                issuer: "ExampleIssuer",
                                                expires: DateTime.UtcNow.AddSeconds(100));
    return handler.WriteToken(token);
}

ASP.NET Core Identity認証

カスタムIUserClaimsPrincipalFactoryを実装するか、UserClaimsPrincipalFactoryを基本クラスとして使用する必要があります。

public class ApplicationClaimsIdentityFactory: Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory <ApplicationUser>
{
    UserManager<ApplicationUser> _userManager;
    public ApplicationClaimsIdentityFactory(UserManager<ApplicationUser> userManager, 
        IOptions<IdentityOptions> optionsAccessor):base(userManager, optionsAccessor)
    {}
    public async override Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
    {
        var principal = await base.CreateAsync(user);
        if (user.IsDeveloper)
        {
            ((ClaimsIdentity)principal.Identity).AddClaims(new[] {
                new Claim("IsDeveloper", "true")
            });
        }
        return principal;
    }
}

次に、それをStartup.ConfigureServicesに登録する必要があります。

services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, ApplicationClaimsIdentityFactory>();

2)主張を確認する

カスタムポリシー

Startup.ConfigureServices

services.AddAuthorization(options =>
{
    options.AddPolicy("Developer", policy =>
                        policy.RequireClaim("IsDeveloper", "true"));
});

開発者のためにあなたの行動を保護します:

[Authorize(Policy = "Developer"), HttpGet]
public string DeveloperSecret()
{
    return "Hello Developer"
}

手動で申し立てを確認する

コントローラのどこかに:

bool isDeveloper = User.Claims.Any(c => c.Type == "IsDeveloper" && c.Value == "true")

他の認証を使用している場合、考え方は同じです。

20
AlbertK