MVC Core 2.0でカスタム承認クレームを作成して(AspNetCore.identityを使用)、カスタムユーザーのブールプロパティを確認するにはどうすればよいですか? IdentityUser(ApplicationUser)を拡張して、ブール値「IsDeveloper」を含めました。クレームベースの認証を使用していて、カスタムクレームを追加したいのですが、どこから始めればよいかわかりません。次のようなカスタムクレームを作成するにはどうすればよいですか。
コアIDクレーム MSDN:クレームベース認証 は理解していますが、カスタムクレームは初めてなので、どこから始めればよいかわかりません。見つけたオンラインドキュメントが機能しないか、私のシナリオに適合しません。
したがって、カスタムクレームをどこかに作成し、カスタムポリシーまたは手動で確認する必要があります。
あなたはこのようなことをすることができます:
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);
}
カスタム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>();
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")
他の認証を使用している場合、考え方は同じです。