C# ASP.Net Idenity-重写FindByName以包含额外的搜索条件
我们有一个设置,其中客户端运行我们系统的独立版本,但它们都使用Entity Framework链接到同一个标识数据库 用户可以在应用程序的多个版本上注册为用户,从而拥有多个具有相同用户名的帐户,但applicationId(存储在web.config中)是唯一的C# ASP.Net Idenity-重写FindByName以包含额外的搜索条件,c#,asp.net-identity,identity,C#,Asp.net Identity,Identity,我们有一个设置,其中客户端运行我们系统的独立版本,但它们都使用Entity Framework链接到同一个标识数据库 用户可以在应用程序的多个版本上注册为用户,从而拥有多个具有相同用户名的帐户,但applicationId(存储在web.config中)是唯一的 我想做的是使用UserManager.FindByName函数,但让它自动将“&&applicationId=X”添加到发送到上下文的请求中。您可以从UserManager类继承,但您必须重写原始代码(.NET现在是开源的,您可以找到原
我想做的是使用UserManager.FindByName函数,但让它自动将“&&applicationId=X”添加到发送到上下文的请求中。您可以从UserManager类继承,但您必须重写原始代码(.NET现在是开源的,您可以找到原始代码)并将逻辑添加到其中。然而,这可能是一个漫长的行动
我的建议是,如果您使用Entity Framework按名称和应用程序id搜索用户id,然后将id传递给FindById方法。如果继续执行此实现,您最终将找到此方法:
public virtual Task<TUser> FindByIdAsync(TKey userId)
{
this.ThrowIfDisposed();
return this.GetUserAggregateAsync((Expression<Func<TUser, bool>>) (u => u.Id.Equals(userId)));
}
公共虚拟任务FindByIdAsync(TKey userId)
{
这个.ThrowIfDisposed();
返回这个.GetUserAggregateAsync((表达式)(u=>u.Id.Equals(userId));
}
为了正确地重写它,它必须在UserStore
类中,因为有大量的内部方法(否则必须重写类中的每个内部方法),并添加一个新的类型参数,该参数将接受ApplicationId
,因为UserStore
是一个泛型类。然后您就可以编写另一个FindByIdAsync
方法,因为它是一个虚拟方法,不能被重写。您还必须重写GetUserAggregateAsync
内部方法,因为它不准备处理新的类型参数
现在,可能会出现更多的问题,但最终,您可以重写此方法以适合您,但我建议您不要这样做,因为要以另一种方式实现某些可能的目标需要大量的工作
文件:
代码: