我有一个实现自定义UserClaimsPrincipalFactory的ASP.NET核心应用程序,包括以下方法:
protected override async Task<ClaimsIdentity> GenerateClaimsAsync(TUser user)
这很好。我可以检查用户的属性并动态包含声明。
但是我想添加一个单独的“管理员”登录端点,以便用户可以决定是否希望在登录时拥有管理员经验。我可以传递有关当前会话的其他信息(例如登录URL或任何表单参数)添加到GenerateClaimsAsync方法?
答案 0 :(得分:1)
要访问来自UserClaimsPrincipalFactory
的请求信息,您可以像下面这样注册IHttpContextAccessor
:
public class CustomUserClaimsPrincipalFactory<TUser> : UserClaimsPrincipalFactory<TUser> where TUser : class
{
private readonly HttpContext _httpContext;
public CustomUserClaimsPrincipalFactory(UserManager<TUser> userManager
, IOptions<IdentityOptions> optionsAccessor
,IHttpContextAccessor httpContextAccessor)
: base(userManager, optionsAccessor)
{
_httpContext = httpContextAccessor.HttpContext;
}
protected override async Task<ClaimsIdentity> GenerateClaimsAsync(TUser user)
{
var ci = await base.GenerateClaimsAsync(user);
ci.AddClaim(new Claim("RequestPath", _httpContext.Request.Path.Value));
return ci;
}
}