C# 登录asp.net core后访问用户声明
我需要访问用户。声明在单独的类中,在asp.net核心的静态方法中。是否有任何解决方案C# 登录asp.net core后访问用户声明,c#,C#,我需要访问用户。声明在单独的类中,在asp.net核心的静态方法中。是否有任何解决方案 User?.Claims?.FirstOrDefault(claim=>claim.Type==ClaimTypes.NameIdentifier)?.Value 您应该通过依赖项注入或直接将IHttpContextAccessor的实例传递给静态方法或类 确保: 从那以后,您可以访问accessor.HttpContext.User您应该通过依赖项注入或直接将IHttpContextAccessor的实例传
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()共享您的答案;我需要这种解决方案您只需将该类注入您需要的任何地方。我已编辑了答案,以包括该部分