C# ASP.Net Idenity-重写FindByName以包含额外的搜索条件

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现在是开源的,您可以找到原

我们有一个设置,其中客户端运行我们系统的独立版本,但它们都使用Entity Framework链接到同一个标识数据库

用户可以在应用程序的多个版本上注册为用户,从而拥有多个具有相同用户名的帐户,但applicationId(存储在web.config中)是唯一的


我想做的是使用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
内部方法,因为它不准备处理新的类型参数

现在,可能会出现更多的问题,但最终,您可以重写此方法以适合您,但我建议您不要这样做,因为要以另一种方式实现某些可能的目标需要大量的工作

文件:

代码: