Net Core Identity 身份驗證:註冊、登陸和註銷 (簡單示例)

1、前言

  通常咱們本身的系統都會用本身設置的一套身份驗證受權的代碼,此次用net core的identity來完成簡單的註冊、登陸和註銷。git

2、數據庫

  首先就是建立上下文,我這裏簡單的建了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

3、Startup註冊服務

  在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();

4、簡單的登陸、註冊和註銷

  既然是簡單的例子,那我是真的怎麼簡單怎麼來,代碼也就沒幾條。

  先建立一個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);
相關文章
相關標籤/搜索