ASP.Net标识-覆盖FindByName以包含额外的搜索条件



我们有一个设置,客户端运行独立版本的系统,但它们都链接到具有实体框架的同一身份数据库。

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

我想做的是使用UserManager.FindByName函数,但让它自动将"&&applicationId=X"添加到发送到上下文的请求中。

你可以从UserManager类继承,但你必须重写原始代码(.NET现在是开源的,你可以找到原始代码)并添加你的逻辑。然而,这可能是一个漫长的操作。

我的建议是,如果您使用实体框架按名称和应用程序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)));
}

为了正确地重写它,它必须在UserStore类内部,因为有大量的内部方法(否则你必须重写类中的每一个内部方法),并添加一个新的类型参数来接受你的ApplicationId,因为UserStore是一个泛型类。然后您就可以编写另一个FindByIdAsync方法,因为它是一个虚拟方法,不能重写。您还必须重写GetUserAggregateAsync内部方法,因为它还没有准备好处理您的新类型参数。

现在,可能还会出现一些小问题,但你最终可以重写这种方法来适应你,但我建议你不要这样做,因为要想以另一种方式实现可能的目标,需要做很多工作。

文档:http://docs.asp.net/projects/api/en/latest/autoapi/Microsoft/AspNet/Identity/EntityFramework/UserStore-TUser-TRole-TContext-TKey/index.html

代码:https://github.com/aspnet/identity/blob/master/src/Microsoft.AspNet.Identity.EntityFramework/UserStore.cs

相关内容

  • 没有找到相关文章

最新更新