模拟登录登出内部demo
其实我不太想做这一节,但是如果不做,直接做下一节你们又看不懂,索性在这一节做一个模拟登录登出的demo,那大家跟着我做即可。下面大家打开VS跟我一起动手!
构建demo
- 先搭建出一个能运行的asp.net core mvc程序,参考我第一节的步骤1,2。
- 在Startup类的ConfigureServices方法里添加代码:
services.AddAuthentication("CookieAuth")
.AddCookie("CookieAuth", config => {
config.Cookie.Name = "Grandpa.cookie";
config.LoginPath = "/Home/Index";
});
- 在HomeController里添加SignIn和SignOut方法:
public IActionResult SignIn()
{
var claims = new Claim[]
{
new Claim(ClaimTypes.Name,"Alice"),
new Claim(ClaimTypes.Role,"user"),
new Claim(ClaimTypes.Email,"Alice@163.com")
};
ClaimsIdentity identity = new ClaimsIdentity(claims,"whatfuck");
ClaimsPrincipal principal = new ClaimsPrincipal(new[] { identity});
HttpContext.SignInAsync(principal);
return RedirectToAction("Index");
}
public IActionResult SignOut()
{
HttpContext.SignOutAsync();
return RedirectToAction("Index");
}
- 运行程序,在浏览器按下F12,将url指定到Home/SignIn,查看浏览器调试界面中的cookie,发现已经有值了,再将url指定到Home/SignOut,发现cookie被清除。
重点分析
OK,之前我们都没有讲过startup里的对Authentication的配置,这里讲一下,先看代码:
services.AddAuthentication("CookieAuth")
.AddCookie("CookieAuth", config => {
config.Cookie.Name = "Grandpa.cookie";
config.LoginPath = "/Home/Index";
});
AddAuthentication,顾名思义是添加一个验证方案,其参数string表示的是验证方案的名字,然后AddCookie,输入两个参数,一个是方案名,另一个是配置这个方案的action,我们addcookie就说明我们采用cookie作为验证用户身份的方案。AddCookie方法通过方案名与指定的方案绑定在一起(所以前面的AddAuthentication也不是无用的)。
然后我们回到HomeController,看到SignIn方法:
//接下来这整段代码做的事情就是模拟一个用户登录
//先声明一组claims,表示这个用户拥有的用户信息
var claims = new Claim[]
{
new Claim(ClaimTypes.Name,"Alice"),
new Claim(ClaimTypes.Role,"user"),
new Claim(ClaimTypes.Email,"Alice@163.com")
};
//把这些claims放到一个claimidentity上,并说明这是哪种验证形式
ClaimsIdentity identity = new ClaimsIdentity(claims,"whatfuck");
//有了claimidentity我们就可以创建当事人(ClaimsPrincipal)了
ClaimsPrincipal principal = new ClaimsPrincipal(new[] { identity});
//最后用这个当事人登录
HttpContext.SignInAsync(principal);
实际上,SignInManager的SignIn做的事情跟我们写的这段模拟代码原理应该是一样的。然后这一节就当是复习一下第一节所说的概念吧。下一节,我们来讲policy和authorization。