【问题标题】:Extending asp.net identity in asp.net mvc 5 application在 asp.net mvc 5 应用程序中扩展 asp.net 身份
【发布时间】:2015-02-09 00:23:08
【问题描述】:

我正在开发 asp.net MVC 5 应用程序。我正在使用 Identity 来创建用户。我第一次使用它并创建了第一个 mvc 5 应用程序。我有两种类型的用户。我想要两种类型的用户都有两个表。所以第一条记录应该插入到 aspnetuser 表中,然后在相关表中,aspnetuser 表应该与这两个表链接,以便我可以访问它们。我为这两种类型的用户创建了模型。我如何将它们与模型中的身份联系起来?

请推荐

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-5


    【解决方案1】:

    嗯,首先,您只能真正拥有一个用户,至少就 Identity 所做的事情而言。不过,您可以将该单个用户子类化以创建其他类型。所以,基本上,你会有这样的设置:

    public class ApplicationUser : IdentityUser
    {
        ...
    }
    
    public class FooUser : ApplicationUser
    {
        ...
    }
    
    public class BarUser : ApplicationUser
    {
        ...
    }
    
    public class BazUser : ApplicationUser
    {
        ...
    }
    

    换句话说,只有一个类直接继承自IdentityUser,而您所有的各种类型都将从该类继承(在本例中为ApplicationUser)。

    默认情况下,实体框架通过 STI 或单表继承处理继承。它的工作原理是您将只有一个表AspNetUsers(身份用户的默认表名),并且您的子类添加的任何属性都将作为该表上的列添加。这意味着您的所有子类属性都必须可以为空,因为如果保留不同的子类或仅保留基本 ApplicationUser 类,则不会设置该属性。

    如果这不可接受,您可以实施其他继承策略,即 TPT(Table-Per-Type)和 TPC(Table-Per-Concrete Type)。在 TPT 中,基本的共享属性都在一个表中,然后每个子类型都有自己的表,其中只有它添加的属性的列。在 TPC 中,每个类都有自己的表来存储所有内容,因此您的每个子类型都将添加所有 Identity 列。不过,我不相信这个特定的选项会与 Identity 兼容,或者至少它会非常繁重,因为角色和声明等事物之间的所有外键关系都必须为每个表复制。即使您可以破解 Identity 来完成这项工作,您也会失去与所有用户一起做任何事情的任何有凝聚力的方式,无论类型如何。

    基本上,您的选项是默认选项,也称为 TPH(按层次结构表)或 TPT。但是,TPT 效率较低,因为它本质上需要对每个查询进行连接才能获得完整的实例。如果您绝对需要在子类上具有不可为空的属性,那么它可能是一个合适的选择。但是,请记住,该属性只需要在数据库级别可以为空。如果您使用 TPH,您仍然可以通过应用程序中的验证来要求这些属性具有值。

    【讨论】:

    • 在这个场景中,请您澄清一下以下方法是否正确?假设我有一个用于创建不同类型用户的表单(创建):FooUser、BarUser、BazUser,并且创建表单上有一个 Type 下拉列表以确定用户类型。为了进行用户操作,我应该创建一个包含所有三个模型的 ViewModel。在创建过程中,我根据用户类型填充此视图模型并将其传递给控制器​​。 >>>
    • >>> 然后我会检查用户类型参数并根据用户类型(FooUser,BarUser,BazUser)创建一个实例。然后用来自 Create 页面的参数填充这个新模型,然后将其传递给 ASP.NET Identity 的 UserManager.Create() 方法。这种方法完全正确吗?或者是否有更好的方法来使用您在答案中提到的这种情况创建新用户?在此先感谢...
    • 就像我在另一篇文章的评论中所说,脚手架AccountController 中的UserManager 实例是UserManager<ApplicationUser> 的一个实例。如果您使用它,所有“用户”子类都将向下转换为ApplicationUser。您需要UserManager<FooUser>UserManager<BarUser> 等的实例来保存正确的类型。除此之外,您的方法似乎还不错。
    • 非常感谢您的回答。投票+
    • 使用 ASP.NET Identity UserManager 检索子类(FooUser、BarUser、BazUser)的属性时出现问题。您还可以发布如何访问这些自定义属性并从 AspNetUsers 表中检索数据吗?谢谢...
    猜你喜欢
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2013-09-06
    相关资源
    最近更新 更多