如何将当前用户从Api层传递到服务层

时间:2016-03-25 16:15:29

标签: asp.net-mvc asp.net-web-api2 asp.net-identity n-tier-architecture

在WebApi中,我可以通过那种方式使用AspIdentity获取当前用户

User.Identity.GetUserId<long>();

但是,服务层不了解AspIdentity。而且我不想将当前用户作为所有方法的参数。

换句话说,我可以用什么模式让当前用户随时随地获取。

原因是记录当前用户在应用程序中执行的所有活动。

2 个答案:

答案 0 :(得分:1)

API旨在成为无状态,您可能使用当前登录的用户,但您可能有第三方应用程序访问您的API。因为它是无状态的,所以当前用户的处理方式与标准Web调用不同。

长话短说:但是,您要对API用户进行身份验证,您需要将用户名/用户ID传递到服务层。好消息是,一旦进行了此设置,您就可以使用相同的服务层方法进行API和非API调用。

答案 1 :(得分:0)

最后,这是我实施它的方式。

在Framework Layer(一个独立于comun的项目中),我添加了这个:

public  ApplicationUser GetCurrentUser()
{
     return _usersService.FindByIdAsync(Convert.ToInt64(HttpContext.Current.User.Identity.GetUserId())).Result;
}

在API中我添加了此接口的实现,如:

{{1}}

由于所有其他层都知道框架层,我可以在任何地方调用它,而不需要引用AspIdentity,也不会将Current用户传递给我的所有函数。

注意:由于以下原因,我将其设为通用: 1-框架(公共层)不了解应用程序用户 2-I可以从上下文中获取任何其他类型,例如ApplicationUserId,它是Long。