当前位置:  开发笔记 > 编程语言 > 正文

asp.net身份userName是唯一的吗?

如何解决《asp.net身份userName是唯一的吗?》经验,为你挑选了1个好方法。

我正在阅读微软的用户身份,并试图在我的MVC5应用程序中应用它们.

据我所知,Id是关键,而userName不是键,定义说它可以为null,所以我问自己......为什么在MVC5项目模板中,当你输入一个已经存在的userName时你会收到错误信息??

我试图达到userName验证,但我不能.

这是数据库定义:

CREATE TABLE [dbo].[AspNetUsers] (
    [Id]            NVARCHAR (128) NOT NULL,
    [UserName]      NVARCHAR (MAX) NULL,

这里是IdentityUser定义,通知(无验证):

namespace Microsoft.AspNet.Identity.EntityFramework
{
    public class IdentityUser : IUser
    {
        public IdentityUser();
        public IdentityUser(string userName);

        public virtual ICollection Claims { get; }
        public virtual string Id { get; set; }
        public virtual ICollection Logins { get; }
        public virtual string PasswordHash { get; set; }
        public virtual ICollection Roles { get; }
        public virtual string SecurityStamp { get; set; }
        public virtual string UserName { get; set; }
    }
}

在注册时,UserManager.CreateAsync调用该方法,这里是定义:

     public async Task Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                var user = new ApplicationUser() { UserName = model.UserName };
                var result = await UserManager.CreateAsync(user, model.Password);
                if (result.Succeeded)
                {
                    await SignInAsync(user, isPersistent: false);
                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    AddErrors(result);
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

这是我达到的最后一件事CreateAsync:

public virtual Task CreateAsync(TUser user, string password);

我在代码中的任何地方都没有看到验证,但它不允许您输入现有的userName.

我认为理解这是如何工作将改善我使用asp.net的Identity概念的经验,并将改进我的代码.

任何指导都非常感谢



1> Casey..:

这发生在IdentityDbContext 中,您的ApplicationDbContext可能继承了它.它会覆盖DbContext的ValidateEntity方法来进行检查.看到这个反编译的代码:

    protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary items)
    {
        if ((entityEntry != null) && (entityEntry.State == EntityState.Added))
        {
            TUser user = entityEntry.Entity as TUser;
            if ((user != null) && this.Users.Any(u => string.Equals(u.UserName, user.UserName)))
            {
                return new DbEntityValidationResult(entityEntry, new List()) { ValidationErrors = { new DbValidationError("User", string.Format(CultureInfo.CurrentCulture, IdentityResources.DuplicateUserName, new object[] { user.UserName })) } };
            }
            IdentityRole role = entityEntry.Entity as IdentityRole;
            if ((role != null) && this.Roles.Any(r => string.Equals(r.Name, role.Name)))
            {
                return new DbEntityValidationResult(entityEntry, new List()) { ValidationErrors = { new DbValidationError("Role", string.Format(CultureInfo.CurrentCulture, IdentityResources.RoleAlreadyExists, new object[] { role.Name })) } };
            }
        }
        return base.ValidateEntity(entityEntry, items);
    }

如果您不想要此行为,则可以直接从DbContext继承.

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有