如何将当前用户从Api层传递到服务层
How to pass the current user from the Api layer to service layer
在 WebApi 中,我可以通过这种方式使用 AspIdentity 获取当前用户
User.Identity.GetUserId<long>();
但是,服务层并不知道 AspIdentity。而且我不想将当前用户作为所有方法的参数传递。
换句话说,我可以使用什么模式让当前用户随处可见。
这样做的原因是要记录当前用户在应用程序中所做的所有 activity。
APIs 是无状态的,您 可以 使用当前登录的用户,但您可能有第 3 方应用程序访问您的 API.因为它是无状态的,所以当前用户的处理方式与标准网络调用不同。
长话短说:无论您如何验证 API 用户,您都需要将 username/userID 传递到服务层。好消息是,一旦完成此设置,就可以对 API 和非 API 调用使用相同的服务层方法。
最后这就是我实现它的方式。
在框架层(一个comun独立项目)我添加了这个:
public interface ICurrentContextProvider<T>
{
T GetCurrentUser();
}
在API我添加了这个接口的实现,比如:
public ApplicationUser GetCurrentUser()
{
return _usersService.FindByIdAsync(Convert.ToInt64(HttpContext.Current.User.Identity.GetUserId())).Result;
}
由于所有其他层都知道框架层,所以我可以在任何地方调用它,而无需引用 AspIdentity,也无需将当前用户传递给我的所有函数。
注意:由于以下原因,我将其设为通用:
1-框架(公共层)不知道应用程序用户
2-我可以从上下文中获取任何其他类型,例如 Long 的 ApplicationUserId。
在 WebApi 中,我可以通过这种方式使用 AspIdentity 获取当前用户
User.Identity.GetUserId<long>();
但是,服务层并不知道 AspIdentity。而且我不想将当前用户作为所有方法的参数传递。
换句话说,我可以使用什么模式让当前用户随处可见。
这样做的原因是要记录当前用户在应用程序中所做的所有 activity。
APIs 是无状态的,您 可以 使用当前登录的用户,但您可能有第 3 方应用程序访问您的 API.因为它是无状态的,所以当前用户的处理方式与标准网络调用不同。
长话短说:无论您如何验证 API 用户,您都需要将 username/userID 传递到服务层。好消息是,一旦完成此设置,就可以对 API 和非 API 调用使用相同的服务层方法。
最后这就是我实现它的方式。
在框架层(一个comun独立项目)我添加了这个:
public interface ICurrentContextProvider<T>
{
T GetCurrentUser();
}
在API我添加了这个接口的实现,比如:
public ApplicationUser GetCurrentUser()
{
return _usersService.FindByIdAsync(Convert.ToInt64(HttpContext.Current.User.Identity.GetUserId())).Result;
}
由于所有其他层都知道框架层,所以我可以在任何地方调用它,而无需引用 AspIdentity,也无需将当前用户传递给我的所有函数。
注意:由于以下原因,我将其设为通用: 1-框架(公共层)不知道应用程序用户 2-我可以从上下文中获取任何其他类型,例如 Long 的 ApplicationUserId。