使用现有数据库名称验证实现OWIN?

时间:2016-02-20 11:16:48

标签: c# asp.net owin

我希望按照我在这里找到的示例实现OWIN: http://www.asp.net/web-api/overview/security/individual-accounts-in-web-api

然而,由于这种工作方式对我来说是新的,特别是使用我自己创建的数据库,我想要一些指导。 我可以毫无问题地提交我的注册申请。

该帖子将我带到了AccountController:

X

这会触发以下代码:

    [AllowAnonymous]
    [Route("Register")]
    public async Task<IHttpActionResult> Register(RegisterBindingModel model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        try { 
            var email = model.Email;
            var password = model.Password;

            var user = new users() {
                 Email = email,
                 PasswordHash = password,
                 Password = password
            };

            IdentityResult result = await UserManager.CreateAsync(user, model.Password);

            if (!result.Succeeded)
            {
                return GetErrorResult(result);
            }

            return Ok();
        }
        catch(Exception ex)
        {
            throw;
        }
    }

ApplicationUserManager:

    public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }

但是出于某种奇怪的原因,我得到了

public class ApplicationUserManager : UserManager<users>
{
    public ApplicationUserManager(IUserStore<users> store)
        : base(store)
    {
    }

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
    {
        var manager = new ApplicationUserManager(new UserStore<users>(context.Get<DaumAuctionEntities>()));
        var dataProtectionProvider = options.DataProtectionProvider;

        // Configure validation logic for passwords
        manager.PasswordValidator = new PasswordValidator
        {
            RequiredLength = 6,
            RequireNonLetterOrDigit = false,
            RequireDigit = false,
            RequireLowercase = true,
            RequireUppercase = true,
        };

        if (dataProtectionProvider != null)
        {
            manager.UserTokenProvider = new DataProtectorTokenProvider<users>(dataProtectionProvider.Create("ASP.NET Identity"));
        }

        return manager;
    }
}

即使我不在任何地方使用名字?!这个名字来自哪里?

所以我认为我做错了什么但是如果没有关于如何用现有数据库实现OWIN的明确解释就很难调试。

在我的上下文/实体和用户表下面,我想用它来存储用户数据。

上下文:

 modelState: {undefined: ["Name cannot be null or empty."]}

用户:IdentityUser:

public partial class DaumAuctionEntities : IdentityDbContext<users>
{
    public DaumAuctionEntities()
        : base("name=DaumAuctionEntities")
    {
    }

    public DbSet<addresses> addresses { get; set; }
    public DbSet<auctions> auctions { get; set; }
    public DbSet<images> images { get; set; }
    public DbSet<users> users { get; set; }
}

编辑:

如果我在尝试调用CreateAsync之前将UserName添加回我的新用户对象,则错误消失但我得到另一个错误:

public partial class users : IdentityUser
{
    public override string UserName
    {
        get
        {
            return Email;
        }
        set
        {
            Email = value;
        }
    }

    override public string PasswordHash
    {
        get
        {
            return Password;
        }

        set
        {
            Password = value;
        }
    }

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<users> manager, string authenticationType)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
        // Add custom user claims here
        return userIdentity;
    }
}

public partial class users
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public System.DateTime CreatedDate { get; set; }
    public Nullable<System.DateTime> ModifiedDate { get; set; }

}

编辑II:

我在教程代码中也有这个问题!这只是.NET中一个棘手的错误?

编辑III

我尝试进行覆盖,您可以在上面的部分类用户中看到。但我仍然有同样的错误。

4 个答案:

答案 0 :(得分:0)

  

问题是由于我在调用UserManager.CreateAsync之前没有将UserName添加到我的新用户。如果我添加UserName,我会遇到与此完全相同的问题:MVC 5 IdentityDbContext and DbContext transactions

该问题似乎表明ASP.NET Identity在查询中使用UserName属性,但Entity Framework认为该属性未映射到Entity模型(EDML)中的数据库列

答案 1 :(得分:0)

我没有看到您的代码存在很多问题

  1. 从您的DaumAuctionEntities类中删除用户DbSet(请参阅this
  2. 从用户类中删除Id属性
  3. 在Register中创建新用户时设置CreatedDate属性 方法
  4. 然后你应该没问题

    此外,关于:

      

    不,它确实通过了。它来自我相信经理但是   每当我尝试调试该代码时,调试器都会声明它跳转   在它上面(很可能是因为它是一个外部库   来自微软)。

    如果使用try / catch包装调用,您将能够看到错误消息

答案 2 :(得分:0)

我在这里分享的代码几乎没有问题,但与你提到的完全不同。我在git上分享了这个例子供你参考。如果您发现任何问题,请亲自尝试并告诉我。

Git网址 - https://github.com/JitJDN/OWINStack

请参阅,代码仍与您的代码相同:

var email = model.Email;                 var password = model.Password;

        var user = new users()
        {
            Email = email,
            PasswordHash = password,
            Password = password
        };

        IdentityResult result = await UserManager.CreateAsync(user, model.Password);

        if (!result.Succeeded)
        {
            return GetErrorResult(result);
        }

        return Ok();

答案 3 :(得分:0)

我终于明白了。

最后我不得不添加调整部分类Users(这是我的SQL数据库中的表),以便UserName和Password覆盖IDentityUser的字段(所以不像我在我的问题中所做的那样):

public partial class users
{
    public int Id { get; set; }
    public string UserName {get; set; }
    public string Password { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }    
    public DateTime? CreatedDate { get; set; }
    public DateTime? ModifiedDate { get; set; }
}

然后我在创建用户时只需传递密码和UserName:

        var user = new users() {
             Email = email,
             UserName = email, 
             PasswordHash = password,
             Password = password
        };