【问题标题】:How to extend asp.net web api 2 user?如何扩展 asp.net web api 2 用户?
【发布时间】:2013-11-25 20:09:28
【问题描述】:

我正在构建一个Web API (2) 项目并使用"individual account" authentication。 我想要

  1. 为用户提供一些详细信息(如名字/姓氏等) (in model)
  2. 登录后获取该信息(在客户端 - 我的案例 windows 手机)

我刚刚开始学习MVCWeb API,所以有人可以帮我吗?

让我稍微解释一下: 我已经创建了 webapi 项目并选择了身份验证方法 - “个人帐户” 好吧,我添加了一个名为 Person 的模型类,它有 2 个字段:FirstName 和 LastName。好吧,我已经使用提琴手注册了一个名为“johndoe”的用户,并使用了密码。在此之后,我使用提琴手在“服务器:端口/令牌”上对该用户进行身份验证并获得不记名令牌。那么这里有一个问题,我需要知道如何将这个用户类与我的模型中的 Person 类关联起来,其次我不知道如何编写一个控制器,所以什么时候发送一个 get 请求我们的控制器函数将返回关联的 Person。

【问题讨论】:

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


    【解决方案1】:

    首先,如:Introduction to ASP.NET Identity

    默认情况下,ASP.NET 身份系统将所有用户信息存储在数据库中。 ASP.NET Identity 使用 Entity Framework Code First 来实现其所有的持久性机制。

    现在,IdentityUser 类将映射到数据库中的 AspNetUsers 表,所以让我们通过创建一个继承自它的新类并添加我们的自定义属性来扩展它:

    public class CustomUser : IdentityUser
    {
        public string Email { get; set; }
    }
    

    那么你应该让 UserManager 类使用 CustomUser 而不是 IdentityUser 类,所以在 Startup.cs 中,将 UserManager 和 UserStore 的泛型类型更改为:

    UserManagerFactory = () => new UserManager<CustomUser>(new UserStore<CustomUser>());
    

    还有属性:

    public static Func<UserManager<CustomUser>> UserManagerFactory { get; set; }
    

    在 ApplicationOAuthProvider.cs 和解决方案中的任何地方,对 UserManager 的泛型类型进行相同的更改,并开始使用 CustomUser 而不是 IdentityUser 。 您可以将新的“电子邮件”属性添加到 RegisterBindingModel 为:

    public class RegisterBindingModel
    {
        [Required]
        [Display(Name = "User name")]
        public string UserName { get; set; }
    
        [Required]
        [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }
    
        [DataType(DataType.Password)]
        [Display(Name = "Confirm password")]
        [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
        public string ConfirmPassword { get; set; }
    
        public string Email { get; set; }
    }
    

    然后在注册中你可以添加价值:

     CustomUser user = new CustomUser
            {
                UserName = model.UserName,
                Email=model.Email
            };
    

    希望对你有帮助

    更新

    如果有人收到 ExceptionMessage“无效的列名 'Discriminator'”。这意味着在按照我的步骤之前已经创建了“AspNetUsers”,并且该表没有“Discriminator”列,所以你应该做的就是进入数据库,通过添加一个新的类型来更改 AspNetUsers 表的设计作为 nvarchar(128)(在我的示例中还添加一个您想要的新列,例如 Email),并将其命名为 Discriminator ,并且不要忘记用适当的值填充旧记录的此列的字段(在我的例如,它将是 CustomUser)。

    【讨论】:

    • 我收到异常消息“无效的列名'鉴别器'”。 :(
    • @Fred 你解决了鉴别器错误吗?我现在明白了:(
    • @Laurence Nyein 你能解释一下你什么时候得到这个异常的,在哪个控制器上?
    • 感谢@YasserSinjab .. 重新创建 AspNetUsers 表后现在很好。
    • 也可以删除鉴别器列吗?在 acl 的上下文中不需要它。
    猜你喜欢
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    相关资源
    最近更新 更多