我创建了一个自定义属性,我想从我的ASPNETCORE angular应用程序中装饰我的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
}
}
在说不以这种方式使用声明之前,我要补充一点,我需要将其适合具有允许功能列表的旧系统。我将这些功能作为声明添加到用户,并检查每个用户的声明是否存在。实际声明的值是用户需要声明的应用程序的名称。
我可以轻松地将这些作为自定义列表添加到我的自定义身份用户中,这可能更合适,但是,我仍然需要访问我的用户。
我可以得到用户,但名称始终为null,我的声明列表也为空。好像我根本没有登录。即使登录后。
答案 0 :(得分:0)
要获取名称,您应该传递ClaimTypes.Name
而不是像
ClaimTypes.Email
var user = context.HttpContext.User.FindFirst(ClaimTypes.Name);
或者,您可以像
一样通过HttpContext.User.Identity.Name
进行检索
var userName = context.HttpContext.User.Identity.Name;
答案 1 :(得分:0)
我通过添加以下内容解决了您的问题:
app.UseAuthentication();
在Startup.cs中。