FormsAuthentication.SetAuthCookie
这两天在研究 Forms 进行用户验证, 它本身没有什么上msdn上查一下就知道怎么个搞法了! 不过我在测试的时候发现也会产生
了一些疑问!
1. 什么我在web.config 的 authentication节点下的 Forms 中设置了Domain,当我FormsAuthentication.SetAuthCookie(loginName, false);
之后, 然后 HttpContext.Current.User.Identity.Name 的时候总是返回给我 "", 这个让我很郁闷!
2. 即然在 config 指定了不行,那我就在代码中指定用户cookie 的 Domain, 但是问题又出现了.
a). 还是无法取到 Identity.Name 的值.
b). 用户成功退出.
如果我们对于 Cookie 的 Domain 不处理的语,也就没有我上面所说的问题.
常规做法:
1, 配置 web.config 节点
<!--
通过 <authentication> 节可以配置 ASP.NET 使用的
安全身份验证模式,
以标识传入的用户。
-->
<authentication mode="Forms">
<forms name=".Bk5173"
protection="All"
timeout="30"
path="/"
requireSSL="false"
cookieless="UseDeviceProfile"
enableCrossAppRedirects="false">
</forms>
</authentication>
2. 验证用户的用户名和密码合法之后:
//设置用户的 cookie 的值
FormsAuthentication.SetAuthCookie(loginName, false);
3 . 上一步就是把用户的名称写 cookie, 之后的话就可以 获取用户的名称.
string idenName = HttpContext.Current.User.Identity.Name;
4. 我们就可以根据 idenName 来对用户判断了. 如果 idenName = "" 的话那么就跳转到 登陆页面让用户登陆,否则的话就显示出用户的名称到 UI 当中.
5. 退出时,用下面的方法就可以了.
FormsAuthentication.SignOut();
到这里,不知有没有注意,都没有对于Cookie Domain 进行设置, 这也正是我将要做的.修改以上的方法.
1).修改方法:
//设置用户的 cookie 的值
FormsAuthentication.SetAuthCookie(loginName, false);
为以下方法:
//设置用户的 cookie 的值
FormsAuthentication.SetAuthCookie(loginName, false);
//获取用户的 cookie
HttpCookie cookie = FormsAuthentication.GetAuthCookie(loginName, false);
//给用户的 cookie 的值加上 cookie 的域 和 过期日期
//更新 用户 cookie
FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(cookie.Value);
FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(1,
oldTicket.Name,
oldTicket.IssueDate,
DateTime.Now.AddMinutes(30),
oldTicket.IsPersistent,
oldTicket.UserData,
FormsAuthentication.FormsCookiePath);
cookie.Domain = cookieDomain;
cookie.Value = FormsAuthentication.Encrypt(newTicket);
//更新 cookie
HttpContext.Current.Response.SetCookie(cookie);
2). 修改用户退出时的方法
HttpCookie cookie = HttpContext.Current.Response.Cookies[FormsAuthentication.FormsCookieName];
cookie.Domain = cookieDomain;
cookie.Value = null;
cookie.Expires = DateTime.Now.AddDays(-1);
//更新cookie
HttpContext.Current.Response.Cookies.SetCookie(cookie);
FormsAuthentication.SignOut();
但是如果按照以上的做法的是无法获取到 Identity.Name 的. 经过分析和查找了相关的资料后将以上方法修改成
1).
//设置用户的 cookie 的值
FormsAuthentication.SetAuthCookie(loginName, false);
//获取用户的 cookie
HttpCookie cookie = FormsAuthentication.GetAuthCookie(loginName, false);
//给用户的 cookie 的值加上 cookie 的域 和 过期日期
//向客户端重写同名的 用户 cookie
FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(cookie.Value);
FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(1,
oldTicket.Name,
oldTicket.IssueDate,
DateTime.Now.AddMinutes(30),
oldTicket.IsPersistent,
oldTicket.UserData,
FormsAuthentication.FormsCookiePath);
cookie.Domain = cookieDomain;
cookie.Value = FormsAuthentication.Encrypt(newTicket);
HttpContext.Current.Response.Cookies.Add(cookie);
2).
HttpCookie cookie = HttpContext.Current.Response.Cookies[FormsAuthentication.FormsCookieName];
cookie.Domain = cookieDomain;
cookie.Value = null;
cookie.Expires = DateTime.Now.AddDays(-1);
HttpContext.Current.Response.Cookies.Add(cookie);
FormsAuthentication.SignOut();
这样的话用户就可以成功登陆和退出了!
可能的原因我估计是cookie 有服务器和客户端之分.所以才会从新生成一个验证票据让之前同名的失效.
FormsAuthentication.SetAuthCookie的更多相关文章
- asp.net 登陆验证 Form表单验证的3种方式 FormsAuthentication.SetAuthCookie;FormsAuthentication.RedirectFromLoginPage;FormsAuthenticationTicket
我们在登陆成功后,使用下面的3种方法,都是同一个目的:创建身份验证票并将其附加到 Cookie, 当我们用Forms认证方式的时候,可以使用HttpContext.Current.User.Ident ...
- 自己实现FormsAuthentication.SetAuthCookie方法,怎样在ASP.NET服务端代码中删除客户端Cookie
如何手动设置AuthCookie ASP.NET中实现可以自己实现FormsAuthentication.SetAuthCookie方法,控制更为灵活 /// <summary> /// ...
- ios中mvc的FormsAuthentication.SetAuthCookie(cookieUserName, false)失败
如果楼主使用.net开发,要注意FormsAuthentication.SetAuthCookie 方法的使用会导致ios出现该问题.因为这个方法在ios设备上是把票据加入到url中,导致url和你的 ...
- IE10下 FormsAuthentication.SetAuthCookie无效的问
问题是这样的,我在本地测试设置身份验证票据都没问题,发布到服务器后访问地址添加了一些特殊的字符,看起来像加过密的,如下: http://www.example.com/(F(1xe9eXIxPzMAL ...
- FormsAuthentication.SetAuthCookie 方法登录
FormsAuthentication.SetAuthCookie 方法,登录的原理. FormsAuthentication.SetAuthCookie 方法登录的过期时间. 登录相关阅读 asp. ...
- Asp.net MVC Form认证,IIS改成集成模式后,FormsAuthentication.SetAuthCookie无效,Request.IsAuthenticated值,始终为false,页面提示HTTP 错误 401.0 - Unauthorized,您无权查看此目录或页面
最近公司领导要求,IIS网站要由经典模式改为集成模式,以提高性能.改完之后,登录成功跳转到主页之后,页面提示“”HTTP 错误 401.0 - Unauthorized“,“您无权查看此目录或页面”, ...
- MVC4 Forms 验证,部署到Hyper-v上.FormsAuthentication.SetAuthCookie无效的问题
这是IE10的一个bug或者说是asp.net4的一个Bug,在IE10里更改了http头,这样导致asp.net4认为客户端没有启用cookie,会导致验证失败.简单的解决方法是,在网站根目录,新增 ...
- asp.net mvc 中[Authorize]在IE9以上版本关于FormsAuthentication.SetAuthCookie无效的问题 解决方案
简单的解决方法是,在网站根目录,新增一个浏览器定义文件(browser definition file) 叫“App_Browsers”文件夹,然后里面放一个“IE10.browser”文件即可,网站 ...
- 基于FormsAuthentication的用户、角色身份认证
一般情况下,在我们做访问权限管理的时候,会把用户的正确登录后的基本信息保存在Session中,以后用户每次请求页面或接口数据的时候,拿到 Session中存储的用户基本信息,查看比较他有没有登录和能否 ...
随机推荐
- 【代码片段】如何使用CSS来快速定义多彩光标
对于web开发中,我们经常都看得到需要输入内容的组件和元素,比如,textarea,或者可编辑的DIV(contenteditable) ,如果你也曾思考过使用相关方式修改一下光标颜色的,那么这篇技术 ...
- 扩展一个boot的插件—tooltip&做一个基于boot的表达验证
在线演示 本地下载 (代码太多请查看原文) 加班,加班加班,我爱加班··· 我已经疯了,哦也. 这次发一个刚接触boot的时候用boot做的表单验证,我们扩展一下tooltip的插件,让他可以换颜色. ...
- 电子商务 B2C 结构图【转载+整理】
本文内容 商品展示 内容展示 订单确认 支付系统 用户中心 商品&促销 CRM 订单处理 WMS 采购管理 财务管理 报表管理 系统设置 WA系统 商品展示 按照 Ebay 内部分类,任何 ...
- java语言特性之一
package java.util.Collections; public static int indexOfSubList(List<?> source, List<?> ...
- Office办公 如何设置WPS的默认背景大小
设计-页面设置,然后修改宽度和高度 因为我们只是需要背景跟平面差不多大(不同屏幕比如宽屏的就比较长),修改宽度和高度的时候注意文字之类的也会被拉伸缩放,所以自己改了之后看效果,比如我100,50的 ...
- python 不需要函数重载
函数重载主要是为了解决两个问题. 可变参数类型. 可变参数个数. 另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其 ...
- 微信小程序 - 配置普通二维码跳小程序
普通二维码跳小程序规则: https://developers.weixin.qq.com/miniprogram/introduction/qrcode.html#%E5%8A%9F%E8%83%B ...
- Mysql中使用Group_Concat将列组合进来。
一.上例子: ) as CityId,group_concat(stationId) ,NameCn from `wd-area` where type='cn3k' and areaId like ...
- 深度学习-Caffe编译测试的小总结
1. 搭建的环境和代码:win7 64bit + vs2013+CUDA7.5 http://blog.csdn.net/thesby/article/details/50880802 2. 编译,制 ...
- ReactNative踩坑日志——页面跳转之——Undefined is not an Object(evaluating this2.props.navigation.navigate)
页面跳转时,报 Undefined is not an Object(evaluating this2.props.navigation.navigate) 出错原因:在一个页面组件中调用了另一个组 ...