我创建了一个自定义属性,我想从我的ASPNETCORE Angle应用程序中装饰我的api控制器。我可以根据需要设置身份验证并从登录名登录应用程序。然后我用我的自定义属性装饰我的 api 方法。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false)]
public class ManageAuditAttribute : AuthorizeAttribute, IAuthorizationFilter
{
public List<Claim> Claims { get; set; }
public ManageAuditAttribute(String feature)
{
Feature = feature;
}
public bool IsAuthorized()
{
// TODO check there is a claim for the given feature
}
private String Feature { get; }
public void OnAuthorization(AuthorizationFilterContext context)
{
var accessor = (IHttpContextAccessor)context.HttpContext.RequestServices.GetService(typeof(IHttpContextAccessor));
var name = context.HttpContext.User.FindFirst(ClaimTypes.Email); //NULL
var user = context.HttpContext.User; // NULL
var userName = Thread.CurrentPrincipal.Identity.Name; // NULL
}
}
在说声明不是以这种方式使用之前,我想补充一点,我需要将其放入具有允许功能列表的遗留系统中。我正在将这些功能作为声明添加到用户,并检查每个用户的声明是否存在。实际声明的值是用户需要声明的应用程序的名称。
我可以轻松地将这些作为自定义列表添加到我的自定义身份用户中,这可能更合适,但是,我仍然需要访问我的用户。
我可以获取用户,但名称始终为空,我的声明列表也为空。 就好像我根本没有登录一样。即使在登录后。
要检索名称,您应该传递ClaimTypes.Name
而不是像 ClaimTypes.Email
var user = context.HttpContext.User.FindFirst(ClaimTypes.Name);
或者,您可以通过HttpContext.User.Identity.Name
检索
var userName = context.HttpContext.User.Identity.Name;
我已经通过添加以下内容解决了您的问题:
app.UseAuthentication();
在启动.cs。