UserManager<T> 类不是开箱即用的,您必须自己定义它。您可以使用默认实现,也可以根据需要定义自己的类。
例如:
MyUserStore.cs
这是用户的来源(例如数据库),您可以从ClaimsPrincipal 的任何声明中检索您自己的用户。
public class MyUserStore: IUserStore<MyUser>, IQueryableUserStore<MyUser>
{
// critical method to bridge between HttpContext.User and your MyUser class
public async Task<MyUser> FindByIdAsync(string userId, CancellationToken cancellationToken)
{
// that userId comes from the ClaimsPrincipal (HttpContext.User)
var user = _users.Find(userId);
return await Task.FromResult(user);
}
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// you'll need both a user and a role class. You can also implement a RoleStore if needed
services
.AddIdentity<MyUser, MyRole>()
.AddUserStore<MyUserStore>();
services.Configure<IdentityOptions>(options =>
{
// This claim will be used as userId in MyUserStore.FindByIdAsync
options.ClaimsIdentity.UserIdClaimType = ClaimTypes.Name;
});
}
MyController .cs
然后,在您的控制器中,您可以访问UserManager<MyUser> 类:
public class MyController : Controller
{
private readonly UserManager<User> _userManager;
public MyController(UserManager<User> userManager)
{
_userManager = userManager;
}
[HttpGet("whatever")]
public async Task<IActionResult> GetWhatever()
{
// this will get your user from the UserStore,
// based on the ClaimsIdentity.UserIdClaimType from the ClaimsPrincipal
MyUser myUser = await _userManager.GetUserAsync(User);
}
}