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



我创建了一个自定义属性,我想从我的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。

相关内容

  • 没有找到相关文章

最新更新