自动填充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; }
}
我希望能够实现两件事,虽然我不确定如何不重复代码在我所有的控制器:
- 通过Active Directory组进行身份验证的用户将创建一个用户模型并将其存储在数据库中(如果该模型还不存在)。
- 当创建新项目时,
CreatedByUserId
将被User
的Id
填充。
我相信第一部分可以通过一个全局AuthorizeAttribute
过滤器来实现,如果它们不存在,它将创建一个新的User
,并在它们存在时检索Id
,但是应该将其存储在哪里以供将来参考。
第二部分我不确定,我相信可以做到这一点,而不必根据当前用户查询数据库。这个值可以通过使用User
访问站点时检索到的Id
的构造函数来设置吗?
自定义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)。返回用户。