如何在Web N层应用程序中出于审核目的将用户身份从用户界面层传递到数据访问层?

时间:2018-07-20 10:05:50

标签: c# asp.net-mvc asp.net-web-api n-tier-architecture n-layer

我已经构建了一个Web应用程序,该应用程序以n层体系结构构建,即UI,BLL,API(WebAPI),DAL。通过这种关注分离,我想要实现的是在DAL上启用基本审核,即RowCreatedBy,RowUpdatedBy等,但是我想找出什么是将用户身份从UI层传递到我的数据访问层,而没有将其添加为所有我的原始调用的参数。那里的选项正在使用Thread.CurrentPrincipal,但是它可以工作,但是要注意的是,我的应用程序托管在具有特定标识集的apppool下的IIS中。我希望CurrentUser在我的所有应用程序层中都可用。请告知最佳方法?

注意:我知道人们可能会问这个问题,但是从我看到的其他参考文献来看,没有一个满足我的情况。

2 个答案:

答案 0 :(得分:0)

我不能说我的方法是“最好的”方法,但它对我来说是合适的。

就我而言,MVC 5 Web应用程序使用Microsoft的Identity进行身份验证。我使用三个数据库来分离问题,

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

当记录归因于用户的应用程序数据库中存储时,将使用userId(身份数据库中的nvarchar(128)Guid字符串)。

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

在需要用户名的Entity Framework模型中,我添加了带有名称字段的部分类并对其进行更新(如下所示)。如果我使用的是View Model,则采用相同的方法。

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

答案 1 :(得分:0)

一种解决方法是将一个类注入您的逻辑/数据层,以允许访问当前登录的用户,例如

已声明(可能在数据层):

interface ICurrentUserService {
     Guid GetCurrentUserId();
}

然后在Web层中实现此操作:

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

如果将此对象注入到您的数据层类中,那么您应该能够调用以获取当前用户ID,而不必绑定到实际从何处获取(即,不依赖于System.Web类)。

相关问题