.net core 认证与受权(二)

前言

这篇紧接着一来写的,在第一篇中介绍了认证与受权,同时提出了这套机制其实就是模拟现实中的认证与受权。
一样这篇介绍在这套机制下,用户信息管理机制?这里就会问了,上一篇中认证和受权不是都ok了吗,怎么会有一个管理机制呢?固然并不必定要使用下面这套机制,可是给了咱们很大的启发。
在上一结中咱们颁发证书是这样的:git

public IActionResult Authenticate()
{
    var SchoolClaims = new List<Claim>()
    {
        new Claim(ClaimTypes.Name,"Jack"),
        new Claim(ClaimTypes.Email,"Jack@fmail.com")
    };

    var LicensClaims = new List<Claim>()
    {
        new Claim(ClaimTypes.Name,"Jack.li"),
        new Claim(ClaimTypes.Email,"Jack@fmail.com"),
        new Claim("begin","2000.10.1")
    };
    var SchoolIdentity = new ClaimsIdentity(SchoolClaims,"Student Identity");
    var CarManagerIdentity = new ClaimsIdentity(LicensClaims, "Licens Identity");
    var userPrincipal = new ClaimsPrincipal(new[] { SchoolIdentity, CarManagerIdentity });
    
    HttpContext.SignInAsync(userPrincipal);
    return RedirectToAction("Index");
}

有没有发现new Claim(ClaimTypes.Name,"Jack") 写死了?个人信息是要从数据库里面查啊。
这时候微软的框架就跳出来了,说用个人这套机制,帮你搞定,究竟是什么机制呢?请看正文。小声逼逼一句,微软就喜欢搞全包工程。
正文均为我的理解,若有不对请指出。数据库

正文

首先说起到一个结构,IdentityUser,这东西是真的博大精深,可是感受有点臃肿,这很微软。
IdentityUser 这里能够简单说明一下,就是存储用户信息的地方。
既然说到用户存储,那么就要说起到数据库了。
建立了一个AppDbContext:app

public class AppDbContext:IdentityDbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options):base(options)
    {

    }
}

之前咱们通常是继承DbContext,DbContext是Ef的上下文。
这里IdentityDbContext,是Ef的扩展,看下我添加了什么。

红色框内是我添加的。
在这里我为了演示使用内存数据库memory,因此我多加了一个库。
而后我在startup中配置使用memory数据库。框架

services.AddDbContext<AppDbContext>(config =>{
                config.UseInMemoryDatabase("Memery");
            });

这样就配置了,如今就解决了数据库的问题。
一样须要配置identity:async

services.AddIdentity<IdentityUser, IdentityRole>(config=> {
                config.Password.RequiredLength = 4;
                config.Password.RequireDigit = false;
                config.Password.RequireNonAlphanumeric = false;
                config.Password.RequireLowercase = false;
                config.Password.RequireUppercase = false;
            }).AddEntityFrameworkStores<AppDbContext>().AddDefaultTokenProviders();

有几个关键的地方,就是config.Password.RequiredLength = 4;等几个password的配置,
由于identetyUser 有默认的机制就是密码必需要大写,而后不小于6位密码等,咱们在这里所有去掉。
AddEntityFrameworkStores () 添加EF 存储实现。
AddDefaultTokenProviders() 默认提供生成token。这种token 用来干啥呢?固然是用来证实用户的了。好比咱们修改密码的时候,咱们发现连接上有一个token,殊途同归之妙哈。
ide

services.ConfigureApplicationCookie(config =>
{
    config.Cookie.Name = "Identity.Cooke";
    config.LoginPath = "/Home/Login";
});

加上验证,当没有登录的时候去到登录页面。
好的配置咱们基本完成了。
接下来就是去实现登录与注册。post

public IActionResult Index()
{
    return View();
}
public IActionResult Secret()
{
    return View();
}

public IActionResult Login()
{
    return View();
}

public IActionResult Register()
{
    return View();
}
[HttpPost]
public async Task<IActionResult> Login(string username, string password)
{
    var user = await _userManager.FindByNameAsync(username);
    if (user != null)
    {
        //sign in
       var Signresult= await  _signInManager.PasswordSignInAsync(user,password,false,false);
        if (Signresult.Succeeded)
        {
            return RedirectToAction("Secret");
        }
    }
    return RedirectToAction("Index");
}
[HttpPost]
public async Task<IActionResult>  Register(string username,string password)
{

    var user = new IdentityUser
    {
        UserName = username,
        Email = ""
    };

    var result=await _userManager.CreateAsync(user,password);
    if (result.Succeeded)
    {
        var Signresult = await _signInManager.PasswordSignInAsync(user, password, false, false);
        if (Signresult.Succeeded)
        {
            return RedirectToAction("Index");
        }
    }
    return RedirectToAction("Index");
}

看到两个http post:
先看Register:
建立了IdentityUser,用来存储用户信息。
_userManager 是用来管理user用户的,好比说建立,删除,修改,是identetyUser 内部机制。
建立过程以下:ui

public HomeController(UserManager<IdentityUser> userManager,SignInManager<IdentityUser> signInManager)
{
    _userManager = userManager;
    _signInManager = signInManager;
}

var result=await _userManager.CreateAsync(user,password); 若是建立用户成功,那么就进行登录以下:code

var Signresult = await _signInManager.PasswordSignInAsync(user, password, false, false);

注意PasswordSignInAsync登录的话会产生token,用于验证咱们是否登录。
当我注册后,产生了token,以下:

看下登录,其实咱们在注册部分就已经介绍了登录了。
我从新把代码放下了:orm

var user = await _userManager.FindByNameAsync(username);
if (user != null)
{
    //sign in
   var Signresult= await  _signInManager.PasswordSignInAsync(user,password,false,false);
    if (Signresult.Succeeded)
    {
        return RedirectToAction("Secret");
    }
}
return RedirectToAction("Index");

发现就多了一步,根据名字去查找user,若是有这个user,而后去比较密码。和平时写code 差很少。
而后登录后就能够进入了咱们想进入的页面。
若是咱们想loginout:

public async Task<IActionResult> Logout()
{
    await _signInManager.SignOutAsync();
    return RedirectToAction("Index");
}

把登录和注册的页面贴下:
login:

<form action="/Home/Login" method="post">
    <input type="text" name="username" value="" />
    <input type="password" name="password" value="" />
    <button type="submit">登录</button>
</form>

注册:

<form action="/Home/Register" method="post">
    <input type="text" name="username" value="" />
    <input type="password" name="password" value="" />
    <button type="submit">注册</button>
</form>

在上一篇中,就很疑问了,上一篇没有登陆啊。
真的没有登陆吗?只是用证书去登陆了,否则怎么能过的了检查呢。

HttpContext.SignInAsync("CookieAuth", userPrincipal);

总结

如今咱们的流程更加的明显了,先要验证用户信息,好比说是否登陆了,这个过程至关于什么呢?咱们用咱们的名字和指纹(password),去获取到了咱们的身份证。有了这张身份证后咱们才有其余的证书,而后才有根据证书去获取一些权限。 后续介绍基本的配置,与原理。

相关文章
相关标签/搜索