如何从ASPNETCORE 2.2应用程序中的AuthorizationAttribute获取用户?

时间:2019-01-12 03:39:57

标签: asp.net-core asp.net-identity httpcontext authorize-attribute

我创建了一个自定义属性,我想从我的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,我的声明列表也为空。好像我根本没有登录。即使登录后。

2 个答案:

答案 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中。