Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 标识用户管理器按电话号码查找_C#_Asp.net Core_Asp.net Identity - Fatal编程技术网

C# 标识用户管理器按电话号码查找

C# 标识用户管理器按电话号码查找,c#,asp.net-core,asp.net-identity,C#,Asp.net Core,Asp.net Identity,在aspnet core identity2.0中,是否有任何方法可以通过用户的电话号码查找用户?可以通过用户名和电子邮件查找用户,但没有电话查找功能,更不用说提供了通用的find(Func)功能。当用户注册电话时,需要检查给定的电话号码是否已经存在,因为一部电话不能由两个用户使用 编辑 启动验证代码: services.AddIdentity<AccountUser, IdentityRole>() .AddEntityFrameworkStores<

在aspnet core identity2.0中,是否有任何方法可以通过用户的电话号码查找用户?可以通过用户名和电子邮件查找用户,但没有电话查找功能,更不用说提供了通用的
find(Func)
功能。当用户注册电话时,需要检查给定的电话号码是否已经存在,因为一部电话不能由两个用户使用

编辑

启动验证代码:

services.AddIdentity<AccountUser, IdentityRole>()
            .AddEntityFrameworkStores<AccountDbContext>()
            .AddDefaultTokenProviders();
services.AddAuthentication().AddJwtBearer(...);
services.AddIdentity()
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
services.AddAuthentication().AddJwtBearer(…);

如果您需要唯一的电话号码,您可以在
应用程序bContext
中(或您用作IdentityDbContext的任何上下文中)添加以下方法:

protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items)
{
    if (entityEntry != null && entityEntry.State == EntityState.Added)
    {
        var errors = new List<DbValidationError>();
        var user = entityEntry.Entity as ApplicationUser;
        //check for uniqueness of phone number
        if (user != null)
        {
            if (Users.Any(u => String.Equals(u.PhoneNumber, user.PhoneNumber)))
            {
                errors.Add(new DbValidationError("User",user.PhoneNumber+" is already registered."));
            }
        }
    }
    return base.ValidateEntity(entityEntry, items); //check for uniqueness of user name and email and return result
}

至于您提出的确切问题:要访问电话号码,您需要直接访问数据上下文。据我所知,无论是
UserManager
还是
UserStore
都没有实现这样的方法,尽管您可以定义自己的user store类继承自
UserStore
,以添加这样的方法。

使用此代码

UserStoreCustom.cs

 public class UserStoreCustom : UserStore<User>
    {
        public UserStoreCustom(ApplicationDbContext context, IdentityErrorDescriber describer = null)
            : base(context, describer)
        {

        }
        public virtual Task<User> FindByPhoneNumberAsync(string PhoneNumber, CancellationToken cancellationToken = default(CancellationToken))
        {
            cancellationToken.ThrowIfCancellationRequested();
            ThrowIfDisposed();
            return Users.FirstOrDefaultAsync(u => u.PhoneNumber == PhoneNumber, cancellationToken);
        }
公共类UserStoreCustom:UserStore
{
public UserStoreCustom(ApplicationDbContext上下文,IdentityErrorDescriber describer=null)
:base(上下文、描述符)
{
}
公共虚拟任务FindByPhoneNumberAsync(字符串PhoneNumber,CancellationToken CancellationToken=default(CancellationToken))
{
cancellationToken.ThrowIfCancellationRequested();
ThrowIfDisposed();
返回Users.FirstOrDefaultAsync(u=>u.PhoneNumber==PhoneNumber,cancellationToken);
}
Startup.cs

services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(configuration.GetConnectionString("DataCenter")));
   
            services.AddIdentity<User, IdentityRole>(option =>
            {
                // configure identity options
                option.Password.RequireDigit = false;
                option.Password.RequireLowercase = false;
                option.Password.RequireUppercase = false;
                option.Password.RequireNonAlphanumeric = false;
                option.Password.RequiredLength = 4;
                option.SignIn.RequireConfirmedPhoneNumber = true;
            })

                .AddRoles<IdentityRole>()
                .AddRoleManager<RoleManager<IdentityRole>>()
                 .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddUserStore<UserStoreCustom>()
                .AddDefaultTokenProviders();

            services.AddSingleton<UserStoreCustom>();
services.AddDbContext(options=>options.UseSqlServer(configuration.GetConnectionString(“数据中心”));
服务。附加性(选项=>
{
//配置标识选项
option.Password.RequireDigit=false;
option.Password.RequireLowercase=false;
option.Password.RequireUppercase=false;
option.Password.RequireNonAlphanumeric=false;
option.Password.RequiredLength=4;
option.SignIn.RequireConfirmedPhoneNumber=true;
})
.AddRoles()
.AddRoleManager()
.AddEntityFrameworkStores()
.AddUserStore()
.AddDefaultTokenProviders();
services.AddSingleton();

你的startup.Auth是什么样子的?你是否覆盖了任何OWIN组件?如果没有,你将需要创建一个新的自定义
UserStore
,如果你想在
UserManager
中使用它,也可能是一个新的组件。我没有使用OWIN,只是使用identity,你能详细介绍一下UserStore吗?现在我想一想。你为什么不呢直接查询表?你可以跳过一大堆环来覆盖所有的auth组件,但如果你真的想知道用户名是否唯一,只需检查数据库?是的,对,我在api控制器中获得了DbContext,因此无论如何都应该能够查询。不应该关注UserManager方法,谢谢!
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(configuration.GetConnectionString("DataCenter")));
   
            services.AddIdentity<User, IdentityRole>(option =>
            {
                // configure identity options
                option.Password.RequireDigit = false;
                option.Password.RequireLowercase = false;
                option.Password.RequireUppercase = false;
                option.Password.RequireNonAlphanumeric = false;
                option.Password.RequiredLength = 4;
                option.SignIn.RequireConfirmedPhoneNumber = true;
            })

                .AddRoles<IdentityRole>()
                .AddRoleManager<RoleManager<IdentityRole>>()
                 .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddUserStore<UserStoreCustom>()
                .AddDefaultTokenProviders();

            services.AddSingleton<UserStoreCustom>();