通过DbContext和UserManager访问

时间:2018-04-20 11:23:46

标签: c# asp.net-core entity-framework-core asp.net-core-identity

使用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(..)

2 个答案:

答案 0 :(得分:3)

今天,您从数据库中查询用户。如果您决定将身份验证委派给授权服务器,该怎么办?我之前看到过这种情况:人们决定创建一个Web API来处理身份验证/授权细节。如果您直接使用DbContext,则必须在使用它的任何地方进行更改。

另一方面,使用UserManager,您只需要更改UserManager的实现以使用HttpClient,以使用Web API来查询用户,创建用户身份所需的角色和其他内容。

UserManager通过IUserStore和其他一些接口封装了实现细节。我会避免直接查询任何身份表,即使它是非常试探性的。

答案 1 :(得分:2)

如果直接使用Entity Framework,主要的缺点是,如果将商店更改为其他内容,则必须更改所有引用。

ASP.NET Core Identity允许您分两步创建自定义商店:

  1. 创建实现所需接口的类

    public class MyStore : IUserStore<ApplicationUser>, ... // many more
    { }
    
  2. 由您更换实体框架商店:

    // default
    services.AddIdentity(...).AddEntityFrameworkStores();
    // yours
    services.AddIdentity(...).AddUserStore<MyStore>();
    
  3. 如果您因为业务需求或Entity Framework Core中没有的数据存储方法(甚至愿意从项目中删除EF Core)而需要创建自定义商店,那么如果您使用了UserManager方法。