登录asp.net核心后访问用户声明

时间:2019-07-15 06:51:47

标签: c#

我需要在单独的类中访问User.Claims并在asp.net核心中的静态方法内进行访问。

User?.Claims?.FirstOrDefault(claim => claim.Type == ClaimTypes.NameIdentifier)?.Value


4 个答案:

答案 0 :(得分:1)

您应该通过依赖项注入或直接将IHttpContextAccessor的实例传递给静态方法或类。

请确保register the accessor as a singleton

services.AddHttpContextAccessor();

从那里开始,您可以访问accessor.HttpContext.User

答案 1 :(得分:0)

在您的startup.cs文件中,您需要首先通过添加以下内容来注册服务

services.AddHttpContextAccessor();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddSingleton<TestClass>();

然后,您应该在您要访问声明的位置注册您的类,以便我们可以将IActionContextAcessor注入其中。

public class TestClass
{
     private IActionContextAccessor actionContextAccessor;
     public Test(IActionContextAccessor actionContextAccessor)
     {
         this.actionContextAccessor = actionContextAccessor;
     }

     public void GetClaims()
     {
        var claims = actionContextAccessor.ActionContext.HttpContext.User.Claims;
        return claims;
     }
 }

现在,您可以在要访问用户声明的任何位置注入此类。 当然,如果您只需要获取声明,也可以将IActionContextAccessor注入任何类中。

例如,在类的构造函数中,您可以说

public class MyCustomClass
{
   private TestClass testClass;
   public MyCustomClass(TestClass testClass)
   {
      this.testClass = testClass;
   }

   public void MyMethod()
   {
      var usersClaims = this.testClass.GetClaims();
   }
}

希望有帮助 SoS

答案 2 :(得分:0)

我强烈建议不要使用静态类实现访问HttpContext

当您需要在类中使用用户标识符时,只需插入IHttpContextAccessor

public class CustomService
{
    private IHttpContextAccessor httpContextAccessor;

    public CustomService(IHttpContextAccessor httpContextAccessor)
    {
        this.httpContextAccessor = httpContextAccessor;
    }

    public void CustomMethod()
    {
        var userId = this.httpContextAccessor.GetUserId();
        // do what you want with user identifier
    }
}

要使此代码正常工作,您需要扩展方法

public static class HttpContextAccessorExtensions
{
    public static int GetUserId(this IHttpContextAccessor httpContextAccessor)
    {
        var value = httpContextAccessor.HttpContext.User?.Claims?.FirstOrDefault(claim => claim.Type == ClaimTypes.NameIdentifier)?.Value;
        if (Int32.TryParse(value, out int userId))
        {
            return userId;
        }

        return 0; // or whatever you want if userId is not found (I would suggest making return type int? and returning null here)

    }
}

此外,您还需要将其添加到Startup.cs方法内的ConfigureServices

services.AddHttpContextAccessor();

答案 3 :(得分:0)

public class BLLBaseClass
   {
       private IHttpContextAccessor httpContextAccessor;
       public BLLBaseClass(IHttpContextAccessor httpContextAccessor)
       {
           this.httpContextAccessor = httpContextAccessor;
       }

       public int UserId
       {
           get
           {
               var value = httpContextAccessor.HttpContext.User?.Claims?.First(c => c.Type == "UserId").Value;
               if (Int32.TryParse(value, out int userId))
               {
                   return userId;
               }

               return 0;
           }
       }
   }

继承该类,您可以直接访问用户ID

 public class GeneralBLL : BLLBaseClass
    {
        private readonly GeneralDAL _generalDal;

        public GeneralBLL(GeneralDAL generalDal, IHttpContextAccessor httpContextAccessor) : base(httpContextAccessor)
        {
            _generalDal = generalDal;
        }

        public List<Department> GetDepartments()
        {
            var userId = UserId;
            try
            {
                return _generalDal.GetDepartments();
            }
            catch (Exception)
            {

                throw new Exception("unable to get departments.");
            }
        }

    }