私のAsp.Net Coreアプリケーションでは、私のClaimsIdentityにカスタムクレームを追加したいので、アプリケーションのさまざまなレイヤーでこれらのレイヤーにアクセスできます。私は私のClaimstransformationを実行し、私はコードをステップするとき、私は理解していないどのような次のコードASP.NET Core 2.0.3 ClaimsTransformerとHttpContextAccessorを組み合わせて、クレームをクリアしています
スタートアップ
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddTransient<IPrincipal>(
provider => provider.GetService<IHttpContextAccessor>().HttpContext.User);
services.AddTransient<IClaimsTransformation, ClaimsTransformer>();
ClaimsTransformer
public class ClaimsTransformer : IClaimsTransformation
{
private readonly IUnitOfWork _unitOfWork;
private readonly IPrincipal _principal;
public ClaimsTransformer(IUnitOfWork unitOfWork, IPrincipal principal)
{
_unitOfWork = unitOfWork;
_principal = principal;
}
public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
var currentPrincipal = (ClaimsIdentity)_principal.Identity;
var identity = (ClaimsIdentity)principal.Identity;
if (currentPrincipal.Claims.All(p => p.Type != "UserId"))
{
var person = _unitOfWork.PersonRepository.GetPersonBySubjectId(principal.Claims.First(p => p.Type == "sub").Value);
person.Wait();
if (person.Result != null)
{
currentPrincipal.AddClaim(new Claim("UserId", person.Result.Id.ToString()));
currentPrincipal.AddClaim(new Claim("TenantId", person.Result.PersonTeams.FirstOrDefault(p => p.Team.TeamType == TeamType.OrganizationTeam)?.Team.OrganizationId.ToString()));
if (principal.Claims.Any(p => p.Type == "Admin"))
{
currentPrincipal.AddClaim(new Claim("Admin", "True"));
}
}
foreach (var claim in identity.Claims)
{
currentPrincipal.AddClaim(claim);
}
}
return Task.FromResult(principal);
}
}
を追加し、これを達成するために、ありますすべての必要なクレームは利用可能ですが、自分のIPrincipalをカスタムクラスに注入すると、ClaimsTransformationを使用しない場合、クレームコレクションは空です目的は注入されたIPrincipalを介して利用可能です。
この問題を解決するために、自分のIPrincipalをClaimsTransformerに追加し、TransformAsync入力パラメーターから要求を複製し、UserIdとTenantIdを追加します。 これは動作しますが、私が持っている問題は、私はClaimsTransformerを実行するとクレームが削除されている理由と私は同じ場所にあったこのハック