ASP.NET Core MVC Identity
ASP.NET Core Identity
()
.AddEntityFrameworkStores();
```
注入服务
```
public class RoleController : Controller
{
private readonly UserManager _userManager;
private readonly RoleManager _roleManager;
public RoleController(
UserManager userManager,
RoleManager role
)
{
this._userManager = userManager;
this._roleManager = role;
}
}
```
身份认证和授权系统
成员管理
默认使用 MSSQL
支持外部的 Provider
登录和注册的 View
AccountController
Model
• UserManager
• SignInManager
注册Identity服务
// 注册 IdentityDbContext
services.AddDbContext<IdentityDbContext>(
options =>
{
options.UseSqlServer(_configuration.GetConnectionString("DefaultConnection"));
}
);
// 注册 Identity 服务
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<IdentityDbContext>();
// 配置 Identity
services.Configure<IdentityOptions>(options =>
{
// Password settings.
options.Password.RequireDigit = false;
options.Password.RequireLowercase = false;
options.Password.RequireNonAlphanumeric = false;
...
});
控制器构造方法注入服务
private readonly SignInManager<IdentityUser> _signInManager;
private readonly UserManager<IdentityUser> _userManager;
public AcountController( SignInManager<IdentityUser> signInManager,UserManager<IdentityUser> userManager)
{
this._signInManager = signInManager;
this._userManager = userManager;
}
登录
//登录
[HttpPost]
public async Task<IActionResult> Login(LoginViewModel loginViewModel)
{
if (!ModelState.IsValid)
{
//判断是否输入了用户名密码,如果不是传回这个方法
return View(loginViewModel);
}
//查询——userManager用户组里有没有这个用户名对象
var user = await _userManager.FindByNameAsync(loginViewModel.UserName);
//如果存在用户,查看密码是否正确
if (user != null)
{
var result = await _signInManager
.PasswordSignInAsync(user, loginViewModel.Password, false, false);
if (result.Succeeded)
{
return RedirectToAction("Index","Home");
}
}
ModelState.AddModelError("", "用户名或密码错误");
return View(loginViewModel);
}
注册
//注册
[HttpPost]
public async Task<IActionResult> Register(RegisterViewModel registerViewModel)
{
if (ModelState.IsValid)
{
var user = new IdentityUser
{
UserName = registerViewModel.UserName
};
var result = await _userManager.CreateAsync(user, "666666");
if (result.Succeeded)
{
return RedirectToAction("Index", "Home");
}
}
return View(registerViewModel);
}
退出
[HttpPost]
public async Task<IActionResult> Logout()
{
await _signInManager.SignOutAsync();
return RedirectToAction("Index", "Home");
}
[Authorize] 特性,限定只有登录用户才能添加数据
在网页中检查用户登录状态(如果无效:Stepup中useMvc中间件前添加 app.UseAuthentication()😉
@if (SignInManager.IsSignedIn(User))
{
+Html代码
}
else
{
+HTML代码
}
@
记录几个严重问题
1.提交提示:.net core实体框架SqlException对象名AspNetCore无效
解决方法:(DbContext改为继承Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext
然后数据库迁移,就对了!)
public class IdentityDbContext: IdentityDbContext
{
public IdentityDbContext(DbContextOptions<IdentityDbContext> options) : base(options)
{
}
public DbSet<RegisterViewModel> registerViewModels { get; set; }
}
IdentityRole用户角色
容器注册服务
```
services.AddIdentity