如何将web n层应用程序中用于审核目的的用户标识从用户界面层传递到数据访问层



我已经构建了一个n层架构的web应用程序,即UI、BLL、API(WebAPI(、DAL。我想通过这种关注点分离实现的是对DAL进行基本审计,即RowCreatedBy、RowUpdatedBy等,但我想找出将用户标识从UI层传递到数据访问层的最佳方式,而无需将其作为参数添加到所有crud调用中。选项是使用Thread.CurrentPrincipal,但它可以工作,但问题是我的应用程序托管在IIS中的一个具有特定标识集的应用程序池下。我希望CurrentUser在我的所有应用程序层中都可用。请告知最佳方法?

注意:我知道人们可能会问这个问题,但从我看到的其他参考资料来看,没有一个能满足我的需求。

实现这一点的一种方法是在逻辑/数据层中注入一个类,允许访问当前登录的用户,例如

声明(可能在数据层(:

interface ICurrentUserService {
Guid GetCurrentUserId();
}

然后在web层中实现这一点:

class CurrentUserService : ICurrentUserService {
public Guid GetCurrentUserId() {
return <<User ID obtained via asp.net identity>>
}
}

如果这个对象被注入到您的数据层类中,那么您应该能够调用以获取当前用户id,而不必绑定到实际获取的位置(即不依赖于System.Web类(。

我不能说我的方法是"最好的",但它适合我。

在我的案例中,MVC 5 web应用程序使用Microsoft的Identity进行身份验证。我使用三个数据库来分离关注点,

  • 身份(身份验证和授权(
  • 应用程序(所有应用程序数据(
  • Elmah(异常记录(

当记录存储在可归属于用户的应用程序数据库中时,将使用userId(Identity数据库中的nvarchar(128(Guid字符串(。

唯一的缺点是,当检索要在客户端显示的记录时,必须将每个用户id的相关名称添加到显示数据中。这很简单,因为我的MVC控制器通过直接注入的方式传入ApplicationUserManager。

在需要用户名的实体框架模型中,我添加了一个带有名称字段的分部类并对其进行更新(如下所示(。如果我使用的是视图模型,那么会采用相同的方法。

r.WhoSavedName = (from u in _userManager.Users where u.Id == r.WhoSavedId select u.UserName).FirstOrDefault();

最新更新