【问题标题】:Auto-populate CreatedByUserId in MVC5 models在 MVC5 模型中自动填充 CreatedByUserId
【发布时间】:2016-10-26 09:36:08
【问题描述】:

我有一个使用 Windows 身份验证的 ASP.NET MVC5 CRUD 应用程序,并且该站点由 Active Directory 组保护,该组中的所有成员都具有相同的权限。我正在使用 Entity Framework 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 设置此值?

【问题讨论】:

    标签: c# asp.net asp.net-mvc entity-framework authorization


    【解决方案1】:

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

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

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

    这是一个很好的链接,可以帮助您入门Overriding SaveChanges and setting ModifiedDate, but how do I set ModifiedBy?

    在您的授权属性中,您可以执行以下操作:

    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 值所在的任何位置访问。

    通过 Active Directory 进行身份验证时要记住的一点是,用户可以并且确实会更改其用户名,例如在结婚或离婚时。 AD 也有一个唯一的 ID(一个 Guid),可以用作参考,但是这也可以改变 - 通常当用户的配置文件被删除并重新创建时。如果您要维护自己的用户记录,您还应该维护 AD Id,并且您的逻辑应该类似于:

    通过用户名查询我的用户表

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

    我的用户存在 -> 如果更改,则更新广告 ID。返回用户。

    我的用户不存在 -> 按 AD Id 查询我的用户表

    我的用户存在 -> 更新我的用户用户名。返回用户。

    我的用户不存在 -> 创建新用户(用户名、广告 ID)。返回用户。

    【讨论】:

    • 我计划通过从活动目录获取他们的真实姓名和其他详细信息来扩展Users 表。生成的 Id 用于我的其他模型,而不是在每个表中存储 DOMAIN\User。此应用程序将生成的数据不会很大,因此将DOMAIN\User 存储为密钥不会有问题。虽然我很想知道如何最好地解决这个问题而不必继续进行数据库调用。
    猜你喜欢
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 2012-10-21
    • 2021-03-16
    • 2023-03-08
    • 2021-11-19
    相关资源
    最近更新 更多