我有一个有角度的项目,我正在使用.net core 2.o Web API。我将用户信息存储在Jwt中,并且希望记录每个数据库操作。我可以通过发送jwt并从服务器端的request.header中获取用户信息。但是问题是,可以在哪里存储?在我以前的MVC项目中,我可以存储在会话中。但是这个项目是API。而且我们使用JWT而不是会话。我如何在请求开始到结束期间实现该存储UserInfo。我想从任何地方访问UserInfo。这是我的actionFilter:
public class TestFilterAttribute : System.Web.Http.Filters.FilterAttribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
var requestedUserInfo= context.HttpContext.Request.Headers["Authorization"];
??????????????? = requestedUserInfo;
}
public void OnActionExecuted(ActionExecutedContext context)
{
}
}
我的架构是这样的:
Contoller =>服务=>存储库。
因此,我必须在所有方法中将参数作为UserInfo发送。因此,我不想将所有方法参数都添加为UserInfo。所以,我想学习摆脱这个问题。
MyController.cs
[HttpGet("GetAllStudents")]
public async Task<ServiceResult>GetAllStudents()
{
var requestedUserId= context.HttpContext.Request.Headers["Authorization"];
return await (studentService.GetAllStudents(requestedUserId));
}
我的service.cs
public async Task<ServiceResult> GetAllStudents(int requestedUserId)
{
return await unitOfWork.studentRepo.GetAllStudents(requestedUserId);
}
我的repository.cs
public async Task<List<Student>> GetAllStudents(int requestedUserId)
{
LogOperation(requestedUserId);
return context.Students.ToList();
}
您可以看到每个方法都发送requestedUserId。我该如何摆脱呢?
答案 0 :(得分:0)
您不存储它,Angular必须在每个请求中发送JWT,而Asp.Net Core webapi必须打开它,对其进行验证,然后从中读取发出请求的用户。
答案 1 :(得分:0)
我找到了解决方案。我们的用户信息已经存储在HttpContext中。我一直在寻找“ HttpContextAccessor ”。您可以通过依赖项注入来注入,然后可以在任何地方使用(例如dbcontext类或repo类)
public class StudentService : IStudentService
{
private readonly IHttpContextAccessor _httpContextAccessor;
public StudentService(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public async Task<List<Student>> GetAllStudents()
{
var requestedUserId= _httpContextAccessor.HttpContext.Headers["Authorization"];
LogOperation(requestedUserId);
return context.Students.ToList();
}
}