Forms认证基础
-
HTTP是无状态的协议,也就是说用户的每次请求对服务器来说都是一次全新的请求,服务器不能识别这个请求是哪个用户发送的。
-
那服务器如何去判断一个用户的请求呢?
-
答案是在每次请求发送时,附带一些其他的信息来识别用户的请求
-
对于Forms认证,每次的请求都携带同样的cookie信息,将此信息发送给服务器,这样服务器就可以识别这个请求到底是哪个用户的。
ASP.NET Forms 认证基础
-
ASP.NET Request.IsAuthenticated为true 代表此用户已经登陆
-
使用 HttpContext.User 来表用用户的信息
ASP.NET Forms 认证过程
-
ASP.NET 检查当前的请求,并根据Web.config中配置的认证方式去构造HttpContext.User 供后续处理
-
后续可以通过判断HttpContext.User 信息来识别用户信息
ASP.NET Forms 登陆与注销
-
使用vs2017 新建一个MVC程序,不进行身份验证
-
在Web.config 的system.web 配置节新增Forms认证信息,内容如下
<authentication mode="Forms" >
<forms cookieless="UseCookies" name="FormsCookie" loginUrl="~/Home/Index.cshtml"></forms>
</authentication>
- 我们使用 Request.IsAuthenticated 来判断用户是否登陆,我们来做一个登陆页面
<div>
<fieldset>
<legend>用户登陆</legend>
<form action="/Home/Login" method="post">
用户名:<input type="text" name="loginName" style="width:200px;" />
密 码:<input type="password" name="loginPwd" style="width:200px" />
<input type="submit" value="登录" />
</form>
</fieldset>
</div>
- 后台验证密码成功后跳转到欢迎的页面
public ActionResult Login(string loginName,string loginPwd)
{
if (string.IsNullOrEmpty(loginName) || string.IsNullOrEmpty(loginPwd))
return Redirect("Index");
if (loginName == "Admin" && loginPwd == "Admin")
{
FormsAuthentication.SetAuthCookie(loginName, true);
return RedirectToAction("Index", "Welcome");
}
else
{
return Redirect("Index");
}
}
- 在欢迎页面如果已登录显示用户名,如果未登录显示登录地址进行登录
<div>
<fieldset>
<legend>
欢迎
</legend>
@if (Request.IsAuthenticated)
{
@: 你好 @Context.User.Identity.Name
}
else
{
<div>
还未登录,请进行 <a href="/Home/Index">登录</a>
</div>
}</fieldset>
</div>
总结
可以看到我们在验证完用户名和密码后,只是调用了 FormsAuthentication.SetAuthCookie(loginName, true); 执行完之后ASP.NET 就可以识别此用户后续的请求。这个方法帮我们做了如下流程:
用户登录流程
-
根据用户名创建一个FormsAuthenticationTicket对象
-
调用FormsAuthenticatin.Encrypt() 进行加密
-
根据加密结果创建名称为 FormsCookie (来自Web.config中的配置) 的cookie
-
将此cookie 写入Response 返回给浏览器
-
浏览器在进行后续请求时会携带此cookie到服务端。
每次请求时的认证流程
-
浏览器在发送请求时携带cookie信息
-
FormsAuthenticationModule 读取cookie
-
从cookie中解析出FormsAuthenticationTicket 对象,过期的对象将被忽略
-
根据FormsAuthenticationTicket 对象构造 FormsIdentity对象并设置HttpContext.User
-
ASP.NET 程序后续 HttpContext.User来判断用户信息
到此我们已经完成正整个认证流程。
更多详细内容请参见大神 Fish Li (李奇峰)
|
请发表评论