通常咱们本身的系统都会用本身设置的一套身份验证受权的代码,此次用net core的identity来完成简单的注册、登陆和注销。git
首先就是建立上下文,我这里简单的建了Users和UserClaim表,要是没有UserClaim等下的登陆操做是会报错的,应该是有身份认证方面的关系。数据库
public class DataBaseContext : DbContext { public DataBaseContext(DbContextOptions<DataBaseContext> options) : base(options) { } public DbSet<User> Users { get; set; } public DbSet<IdentityUserClaim<string>> UserClaim { get; set; } } public class User : IdentityUser { public string companyId { get; set; } public string PassWord { get; set; } }
这里User继承了IdentityUser,IdentityUser中就用不少的基础字段,像是UserName等因此咱们能够再User类中扩展咱们的字段。cookie
add-migration Init和update-database Init再控制台执行,生成表。app
在ConfigureServices中注册以下框架
一、数据库上下文链接async
//添加数据库链接 services.AddDbContext<DataBaseContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
二、添加标识服务,包括默认的UI、令牌提供和身份验的cookie,而且添加identity信息存储的实体框架实现,用于关联数据库建立用户获取用户信息等。AddDefaultIdentity一个至关于AddIdentity、AddDefaultUI和AddDefaultTokenProviders三个。若是User不继承IdentityUser使用AddEntityFrameworkStores会报错。ide
services.AddDefaultIdentity<User>().AddEntityFrameworkStores<DataBaseContext>();
三、添加Identity的选项,能够设定密码的强度、长度、使用字符、密码输入错误次数等等。ui
services.Configure<IdentityOptions>(options => { // 密码设置 options.Password.RequireDigit = false; options.Password.RequireLowercase = false; options.Password.RequireNonAlphanumeric = false; options.Password.RequireUppercase = false; options.Password.RequiredLength = 1; options.Password.RequiredUniqueChars = 1; // 锁定设置 options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5); options.Lockout.MaxFailedAccessAttempts = 5; options.Lockout.AllowedForNewUsers = true; // 用户设置 options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+"; options.User.RequireUniqueEmail = false; });
四、配置应用程序的cookiespa
services.ConfigureApplicationCookie(options => { // Cookie设置 options.Cookie.HttpOnly = true; options.ExpireTimeSpan = TimeSpan.FromMinutes(5); options.LoginPath = "/Login/Index"; options.AccessDeniedPath = "/Home/Index"; options.SlidingExpiration = true; });
在Config中注册身份认证code
app.UseAuthentication();
既然是简单的例子,那我是真的怎么简单怎么来,代码也就没几条。
先建立一个Home控制器并加上[Authorize]特性,没获得验证的就通通没法访问。按照上面的Startup.cs已经将UserManager依赖注入了,它是用来管理用户的好比注册啥的。
[Authorize] public class HomeController : Controller { private UserManager<User> userManager;public HomeController(UserManager<User> _userManager) { userManager = _userManager; } public async Task<IActionResult> Index() { var res = await userManager.GetUserAsync(HttpContext.User); return View(); } }
而后建立一个Login控制器,咱们能够在里面写登陆、注册和注销的方法。Login控制器除了UserManager外还要注入SignManager,它是用来用户登陆、注销等操做的。
public class LoginController : Controller { //用于提供持久性存储的用户信息 private UserManager<User> userManager; private SignInManager<User> signManager; public LoginController(UserManager<User> _userManager,SignInManager<User> _signManager) { userManager = _userManager; signManager = _signManager; } }
一、注册
注册直接用CreateAsync方法,会自动在数据库建立用户。SignInAsync方法用于刚注册的立刻用户登陆。
public async Task<IActionResult> Register() { var user = new User() { UserName = "xu2", PhoneNumber = "123", companyId = "1" }; var result = await userManager.CreateAsync(user, "123"); await signManager.SignInAsync(user, true); if (result.Succeeded) return Redirect("/Home/Index"); return Redirect("/Login/Index"); }
二、登陆
登陆不能用SignInAsync了,要用PasswordSignInAsync密码登陆
public async Task<IActionResult> Index() { var s = await signManager.PasswordSignInAsync("xu", "123", true, false); return View(); }
三、注销
public async Task<IActionResult> LogOut() { await signManager.SignOutAsync(); return View(); }
四、获取当前登陆用户
var res = await userManager.GetUserAsync(HttpContext.User);