C# 标识用户管理器按电话号码查找
在aspnet core identity2.0中,是否有任何方法可以通过用户的电话号码查找用户?可以通过用户名和电子邮件查找用户,但没有电话查找功能,更不用说提供了通用的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<
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>();