C# 登录asp.net core后访问用户声明

C# 登录asp.net core后访问用户声明,c#,C#,我需要访问用户。声明在单独的类中,在asp.net核心的静态方法中。是否有任何解决方案 User?.Claims?.FirstOrDefault(claim=>claim.Type==ClaimTypes.NameIdentifier)?.Value 您应该通过依赖项注入或直接将IHttpContextAccessor的实例传递给静态方法或类 确保: 从那以后,您可以访问accessor.HttpContext.User您应该通过依赖项注入或直接将IHttpContextAccessor的实例传

我需要访问用户。声明在单独的类中,在asp.net核心的静态方法中。是否有任何解决方案

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

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

确保:


从那以后,您可以访问
accessor.HttpContext.User

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

确保:


从那以后,您可以访问startup.cs文件中的
accessor.HttpContext.User

,您需要首先通过添加以下内容注册服务

services.AddHttpContextAccessor();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddSingleton<TestClass>();
现在,您可以将这个类注入到您想要访问用户声明的任何地方。 当然,如果只需要获取声明,也可以将IActionContextAccessor注入任何类

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

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

   public void MyMethod()
   {
      var usersClaims = this.testClass.GetClaims();
   }
}
希望有帮助
SoS

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

services.AddHttpContextAccessor();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddSingleton<TestClass>();
现在,您可以将这个类注入到您想要访问用户声明的任何地方。 当然,如果只需要获取声明,也可以将IActionContextAccessor注入任何类

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

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

   public void MyMethod()
   {
      var usersClaims = this.testClass.GetClaims();
   }
}
希望有帮助
SoS

我强烈建议不要使用静态类实现来访问
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
方法中


我强烈建议不要使用静态类实现来访问
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
方法中

继承该类,您可以直接访问userid

 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.");
            }
        }

    }
public类generallbll:BLLBaseClass
{
私有只读通用文件_general;
public GeneralBLL(GeneralDAL GeneralDAL,IHttpContextAccessor httpContextAccessor):基(httpContextAccessor)
{
_通用=通用;
}
公共部门名单(
{
var userId=userId;
尝试
{
return_generalDal.GetDepartments();
}
捕获(例外)
{
抛出新异常(“无法获取部门”);
}
}
}
继承该类,您可以直接访问userid

 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.");
            }
        }

    }
public类generallbll:BLLBaseClass
{
私有只读通用文件_general;
public GeneralBLL(GeneralDAL GeneralDAL,IHttpContextAccessor httpContextAccessor):基(httpContextAccessor)
{
_通用=通用;
}
公共部门名单(
{
var userId=userId;
尝试
{
return_generalDal.GetDepartments();
}
捕获(例外)
{
抛出新异常(“无法获取部门”);
}
}
}


你能分享一下我的答案中的任何例子吗?答案与问题无关。问题的关键是int-UserId(){var user=user.Identity.Name;返回Convert.ToInt32(user);在这里,用户不在当前上下文中。如何修复它在代码中的位置是
accessor.HttpContext.User
?您能分享一下我的答案中的任何例子吗?答案与问题不相关int UserId(){var User=User.Identity.Name;返回Convert.ToInt32(User);在这里,用户不在当前上下文中。如何修复它在代码中的位置是
accessor.HttpContext.User
?public int UserId(){var User=accessor.HttpContext.User?.Identity?.Name;返回Convert.ToInt32(User);}我需要这种解决方案基本上你又创建了同一个问题吗?是的,我需要一个解决方案你不应该问重复的问题。你需要更新现有的!!公共int UserId()的可能重复项{var user=accessor.HttpContext.user?.Identity?.Name;返回Convert.ToInt32(user);}我需要这种解决方案基本上你又创建了同一个问题吗?是的,我需要一个解决方案你不应该问重复的问题。你需要更新你现有的!!可能重复如何从其他类访问它。与codeHrmContext.GetClaims()共享你的答案;我需要这种解决方案您只需将该类注入到需要的任何位置。我已编辑了答案,以包含该位以及如何从其他类访问该位。请与codeHrmContext.GetClaims()共享您的答案;我需要这种解决方案您只需将该类注入您需要的任何地方。我已编辑了答案,以包括该部分