这两天在研究 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的更多相关文章

  1. asp.net 登陆验证 Form表单验证的3种方式 FormsAuthentication.SetAuthCookie;FormsAuthentication.RedirectFromLoginPage;FormsAuthenticationTicket

    我们在登陆成功后,使用下面的3种方法,都是同一个目的:创建身份验证票并将其附加到 Cookie, 当我们用Forms认证方式的时候,可以使用HttpContext.Current.User.Ident ...

  2. 自己实现FormsAuthentication.SetAuthCookie方法,怎样在ASP.NET服务端代码中删除客户端Cookie

    如何手动设置AuthCookie ASP.NET中实现可以自己实现FormsAuthentication.SetAuthCookie方法,控制更为灵活 /// <summary> /// ...

  3. ios中mvc的FormsAuthentication.SetAuthCookie(cookieUserName, false)失败

    如果楼主使用.net开发,要注意FormsAuthentication.SetAuthCookie 方法的使用会导致ios出现该问题.因为这个方法在ios设备上是把票据加入到url中,导致url和你的 ...

  4. IE10下 FormsAuthentication.SetAuthCookie无效的问

    问题是这样的,我在本地测试设置身份验证票据都没问题,发布到服务器后访问地址添加了一些特殊的字符,看起来像加过密的,如下: http://www.example.com/(F(1xe9eXIxPzMAL ...

  5. FormsAuthentication.SetAuthCookie 方法登录

    FormsAuthentication.SetAuthCookie 方法,登录的原理. FormsAuthentication.SetAuthCookie 方法登录的过期时间. 登录相关阅读 asp. ...

  6. Asp.net MVC Form认证,IIS改成集成模式后,FormsAuthentication.SetAuthCookie无效,Request.IsAuthenticated值,始终为false,页面提示HTTP 错误 401.0 - Unauthorized,您无权查看此目录或页面

    最近公司领导要求,IIS网站要由经典模式改为集成模式,以提高性能.改完之后,登录成功跳转到主页之后,页面提示“”HTTP 错误 401.0 - Unauthorized“,“您无权查看此目录或页面”, ...

  7. MVC4 Forms 验证,部署到Hyper-v上.FormsAuthentication.SetAuthCookie无效的问题

    这是IE10的一个bug或者说是asp.net4的一个Bug,在IE10里更改了http头,这样导致asp.net4认为客户端没有启用cookie,会导致验证失败.简单的解决方法是,在网站根目录,新增 ...

  8. asp.net mvc 中[Authorize]在IE9以上版本关于FormsAuthentication.SetAuthCookie无效的问题 解决方案

    简单的解决方法是,在网站根目录,新增一个浏览器定义文件(browser definition file) 叫“App_Browsers”文件夹,然后里面放一个“IE10.browser”文件即可,网站 ...

  9. 基于FormsAuthentication的用户、角色身份认证

    一般情况下,在我们做访问权限管理的时候,会把用户的正确登录后的基本信息保存在Session中,以后用户每次请求页面或接口数据的时候,拿到 Session中存储的用户基本信息,查看比较他有没有登录和能否 ...

随机推荐

  1. (转)溶解shader

    游戏中物体腐化消失,燃烧消失时,会有从局部慢慢消失的效果,然后配合一些粒子特效,就能达到非常好的美术效果.类似效果如下: 注:_DissColor为溶解主色,_AddColor为叠加色,按照溶解的移动 ...

  2. 启动项目时出现Not a JAR.......Find JAR........一指循环就是起不来

    出现问题原因就是mapper的映射文件有问题,里面的返回类型如是实体找不到或者找重复的就会这样 解决办法就是:确保在用的实体(路径)能找到,切记不能有重名的实体

  3. [Jest] Set up Testing Globals in an Application with Jest

    For some React component testing, we have common setup in each test file: import { render } from 're ...

  4. Android开发——Android M(6.0) 权限解决方案

    Android开发--Android M(6.0) 权限解决方案 自从Android M(6.0)发布以来,权限管理相比以前有了很大的改变,很多程序员发现之前运行的好好的Android应用在Andro ...

  5. FIS前端集成解决方案

    FIS前端集成解决方案-文档结构 什么是FIS 部署FIS FIS基本使用 模块定义 加载方式 调用Tangram 2.0 FIS开发实例 --附件下载-- 什么是FIS FIS提供了一套贯穿开发流程 ...

  6. 實戰ESXi 5設置MPIO 打造IP-SAN負載平衡容錯

    http://www.netadmin.com.tw/article_content.aspx?sn=1305100002 測試MPIO負載平衡及容錯移轉機制VMware vSphere ESXi主機 ...

  7. sell 项目 订单表 设计 及 创建

    1.数据库设计 2.订单表 创建 /** * 订单表 */ create table `order_master` ( `order_id` varchar(32) not null, `buyer_ ...

  8. Java IO的应用之实现大文件复制

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827481.html  用IO进行文件复制,实质就是用FileInputStream链接要复制的文件,按一定规 ...

  9. Windows下安装Oracle Database 12c Release 1(12.1.0.2.0) - Enterprise Edition

    Windows下安装Oracle Database 12c Release 1(12.1.0.2.0) 最近因需要在Oracle 数据库上建立ODI的资料档案库,需要安装Oracle Database ...

  10. idea 配置svn

        1.情景展示 idea安装好后,如何配置svn? 2.分析 由于没有针对idea的svn插件,因此只能选择安装svn的客户端. 3.解决方案 第一步:下载小乌龟SVN客户端: 官网地址:htt ...