自动填充CreatedByUserId在MVC5模型

本文关键字:MVC5 模型 CreatedByUserId 填充 | 更新日期: 2023-09-27 18:15:03

我有一个ASP。NET MVC5 CRUD应用程序使用Windows身份验证,并且站点由Active Directory组保护,则该组中的所有成员都具有相同的权限。我正在使用实体框架6访问数据库。

目前我有一个非常基本的User模型,其中Login将是DOMAIN'username。我所有的模型都通过CreatedByUserId属性引用这个模型,我省略了与下面其他模型的关系。

public class User
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    [Index(IsUnique = true)]
    [MaxLength(100)]
    public string Login { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime CreatedDatetime { get; set; }
}

我希望能够实现两件事,虽然我不确定如何不重复代码在我所有的控制器:

  1. 通过Active Directory组进行身份验证的用户将创建一个用户模型并将其存储在数据库中(如果该模型还不存在)。
  2. 当创建新项目时,CreatedByUserId将被UserId填充。

我相信第一部分可以通过一个全局AuthorizeAttribute过滤器来实现,如果它们不存在,它将创建一个新的User,并在它们存在时检索Id,但是应该将其存储在哪里以供将来参考。

第二部分我不确定,我相信可以做到这一点,而不必根据当前用户查询数据库。这个值可以通过使用User访问站点时检索到的Id的构造函数来设置吗?

自动填充CreatedByUserId在MVC5模型

自定义Authorize属性听起来是个好主意。您可以验证用户是否经过身份验证,并检查他们是否是授权组的成员。我建议您不需要单独存储它们的id。他们的身份将通过

在整个应用程序中可用。

HttpContext.Current.Request.RequestContext.HttpContext.User.Identity.Name

在你的DbContext中,你可以覆盖SaveChanges()并访问用户的身份。

这是一个很好的链接,让你开始重写SaveChanges和设置ModifiedDate,但是我如何设置ModifiedBy?

在你的authorize属性中,你可以这样做:

protected override void OnAuthorization(AuthorizationContext filterContext)
{
    // Get user id (create if not exists) using 
    // filterContext.HttpContext.User.Identity.Name
    // Set  generic principal using Id
    IPrincipal principal = new GenericPrincipal(
    new GenericIdentity("myuserid"), new string[] { "myrole" });
    HttpContext.Current.User = principal;
}

那么你的用户id将可以在任何地方访问旧的DOMAIN'Username值。

通过活动目录进行身份验证时要记住的另一点是,用户可以并且确实更改了他们的用户名,例如在结婚或离婚时。AD也有一个唯一的ID (Guid),可以用作参考,但是这也可以改变——通常当用户的配置文件被删除和重新创建时。如果你在维护你自己的用户记录,你也应该维护AD Id,你的逻辑应该像这样:

用username查询My User表

按用户名查询AD(返回AD Id为Guid)

My User exists ->如果Ad Id已更改,则更新Ad Id。返回用户。

My User不存在->根据AD Id查询My User表

My User exists -> update My User username。返回用户。

My User不存在->创建新用户(Username, Ad Id)。返回用户。