【问题标题】:Accessing by DbContext vs UserManager通过 DbContext 与 UserManager 访问
【发布时间】:2018-10-01 02:35:00
【问题描述】:
使用 UserManager 或 DbContext 有什么缺点或优点吗?
如果我使用这个:
public class UserManager<TUser> : IDisposable where TUser : class
public virtual Task<TUser> FindByIdAsync(string userId);
或者,如果我使用直接 dbcontext,例如:
var user = dbContext.Users.Where(x => x.Id == model.Id).FirstOrDefault();
// Login like this
await HttpContext.SignInAsync(..)
【问题讨论】:
标签:
c#
asp.net-core
entity-framework-core
asp.net-core-identity
【解决方案1】:
今天,您从数据库中查询用户。如果您决定将身份验证委托给授权服务器怎么办?我以前见过这种情况:人们决定创建一个 Web API 来处理身份验证/授权细节。如果您直接使用DbContext,则必须在使用它的任何地方进行更改。
另一方面,通过使用UserManager,您只需将UserManager 的实现更改为使用HttpClient,以使用Web API 来查询用户、角色和其他需要的东西创建您的用户身份。
UserManager通过IUserStore和其他一些接口封装了实现细节。我会避免直接查询任何 Identity 表,即使它是非常试探性的。
【解决方案2】:
如果您直接使用实体框架,主要缺点是如果您将存储更改为其他内容,则必须更改所有引用。
ASP.NET Core Identity 允许您分两步创建自定义存储:
-
创建一个实现所需接口的类
public class MyStore : IUserStore<ApplicationUser>, ... // many more
{ }
-
用你的替换实体框架存储:
// default
services.AddIdentity(...).AddEntityFrameworkStores();
// yours
services.AddIdentity(...).AddUserStore<MyStore>();
如果您因为业务需求或 Entity Framework Core 中不可用的数据存储方法(或者甚至愿意从项目中删除 EF Core)而需要创建自定义存储,则最好使用UserManager 方法。