我需要在单独的类中访问User.Claims并在asp.net核心中的静态方法内进行访问。
User?.Claims?.FirstOrDefault(claim => claim.Type == ClaimTypes.NameIdentifier)?.Value
答案 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.");
}
}
}