.net Forms身份验证不能用在应用的分布式部署中吗?
参照网上的一些方法,使用Forms身份验证对应用进行分布式部署,发现没有成功。
应用部署的两台内网服务器:192.168.1.19,192.168.1.87,使用Nginx做负载分配,配置完全相同;每台都可以登录运行。
<system.web>
<!--配置 ASP.NET 使用的安全身份验证模式,以标识传入的用户。domain=".zt-express.com" -->
<authentication mode="Forms">
<forms name=".GDZDAUTHENFORMS" loginUrl="~/Login.aspx" timeout="" defaultUrl="~/Main.aspx" path="/" protection="All" />
</authentication>
<machineKey validationKey="E804106B394DE7148524A5FB0E7E282F05C3BB98553931F2B3FCDC896473390205326A876AA5490050D795FA181604651878B4285475150437A73F9D705E412A" decryptionKey="9BE9F489677A8285D6A00E902857ABB2986C73534FF2A901" validation="SHA1" />
<authorization>
<allow users="*" />
</authorization>
<anonymousIdentification enabled="true" cookieName=".GDZDanonymous" />
<httpRuntime />
<compilation debug="true" targetFramework="4.0" />
<pages enableSessionState="true" controlRenderingCompatibilityVersion="4.0" />
<customErrors mode="Off" />
<sessionState timeout="">
</sessionState>
</system.web>
以下时登录成功后的处理
/// <summary>
/// 创建一个票据,放在cookie中
/// 票据中的数据经过加密,解决一下cookie的安全问题。
/// </summary>
/// <param name="userInfo">登录用户</param>
/// <param name="issueDateTime">发布时间</param>
/// <param name="experation">过期时间</param>
/// <param name="isPersistent">持久性</param>
public static void SetCookie(BaseUserInfo userInfo, DateTime? issueDateTime = null, DateTime? experation = null, bool isPersistent = true)
{
if (issueDateTime == null)
{
issueDateTime = DateTime.Now;
}
if (experation == null)
{
//设置COOKIE过期时间
experation = DateTime.Now.AddHours(SystemInfo.UserLoginExperation);
}
BaseSystemInfo.UserInfo = userInfo;
BaseSystemInfo.UserInfo.ServicePassword = BaseSystemInfo.ServicePassword;
BaseSystemInfo.UserInfo.ServiceUserName = BaseSystemInfo.ServiceUserName;
BaseSystemInfo.UserInfo.SystemCode = BaseSystemInfo.SystemCode;
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
string userData = javaScriptSerializer.Serialize(BaseSystemInfo.UserInfo);
//生成验证票据,其中包括用户名、生效时间、过期时间、是否永久保存和用户数据等。
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(, userInfo.NickName, (DateTime)issueDateTime, (DateTime)experation, isPersistent, userData, FormsAuthentication.FormsCookiePath);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));
cookie.Expires = (DateTime)experation;
HttpResponse response = HttpContext.Current.Response;
//指定客户端脚本是否可以访问[默认为false]
cookie.HttpOnly = true;
//指定统一的Path,比便能通存通取
cookie.Path = "/";
response.AppendCookie(cookie); //移除一下权限缓存数据 以便重新获取缓存数据
RemoveRedisCache(userInfo);
}
以下是验证的代码
//测试 HttpContext.Current.User.Identity.IsAuthenticated在分布式部署中是否有效
Response.Write(string.Format("测试 HttpContext.Current.User.Identity.IsAuthenticated在分布式部署中是否有效IsAuthenticated:{0}", HttpContext.Current.User.Identity.IsAuthenticated));
Response.Write("<br/>cookie输出开始=============================");
foreach (string cookieName in Request.Cookies)
{
var mycookie = Request.Cookies[cookieName];
if (mycookie != null)
{
Response.Write("<br/>" + cookieName + "中含有" + mycookie.Values.Count + "个Key");
if (mycookie.Values.Count > )
{
foreach (string s in mycookie.Values)
{
Response.Write("<br/> “" + s + "”=" + mycookie[s].ToString() + ";");
}
}
}
}
Response.Write("<br/>cookie输出完毕============================="); Response.Write("<br/>FormsCookieName=" + FormsAuthentication.FormsCookieName);
HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
if (authTicket != null)
{
string userData = authTicket.UserData;
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
var userInfo = javaScriptSerializer.Deserialize<BaseUserInfo>(userData);
Response.Write("<br/>NickName=" + userInfo.NickName);
}
else
{
Response.Write("<br/>authTicket = null");
}
}
else
{
Response.Write("<br/>authCookie = null");
}
Response.Write("<br/>ClientIpAddress = " + UserInRedis.GetCurrentIpAddress(HttpContext.Current));
Response.Write("<br/>ServerIpAddress = " + Request.ServerVariables.Get("Local_Addr"));
部署完毕,登录系统后,访问测试页面
可以看到当前访问应用被分配到192.168.1.19上了
现在把192.168.1.19的应用停掉,再来访问测试页面
从上面可以看出,访问被分配到192.168.1.87上了,而用于认证的.GDZDAUTHENFORMS cookie没有传过来,其它的cookie传过来了。
这是什么原因呢?同样的域名应该说cookie会传到后台的啊。
参考:http://www.cnblogs.com/fish-li/archive/2012/04/15/2450571.html等文章还是没实现,服务器配置是一样的,按理说,同样的域名,访问时应该把cookie都带过去的啊。
同样的访问请求,应该说每次都会带cookie的,为何在分布式部署中,指向另外一台机子时,cookie获取不到
此问题已发到msdn:https://social.msdn.microsoft.com/Forums/vstudio/zh-CN/f666f1d1-3d9e-4620-babb-1eea9302c0d9/forms?forum=295
.net Forms身份验证不能用在应用的分布式部署中吗?的更多相关文章
- ASP.NET Forms 身份验证
ASP.NET Forms 身份验证 在开发过程中,我们需要做的事情包括: 1. 在 web.config 中设置 Forms 身份验证相关参数.2. 创建登录页. 登录页中的操作包括: 1. 验证用 ...
- asp.net Forms身份验证
Web.config中的配置<system.web><authentication mode="Forms"> <forms name="K ...
- 采用Asp.Net的Forms身份验证时,持久Cookie的过期时间会自动扩展
原文:http://www.cnblogs.com/sanshi/archive/2012/06/22/2558476.html 若是持久Cookie,Cookie的有效期Expiration属性有当 ...
- 采用Asp.Net的Forms身份验证时,非持久Cookie的过期时间会自动扩展
问题描述 之前没有使用Forms身份验证时,如果在登陆过程中把HttpOnly的Cookie过期时间设为半个小时,总会收到很多用户的抱怨,说登陆一会就过期了. 所以总是会把Cookie过期时间设的长一 ...
- Web分布式部署,跨应用程序Forms身份验证的集成方案
最近一个项目要求进行分布式部署.保证在双十一期间系统的正常运行,虽然该系统平时访问量不是很大,但是基于业务需要,必须在至少两台服务器上部署. 该系统需要登录后才可以使用,首先需要解决分布式部署的用户状 ...
- Forms身份验证和基于Role的权限验证
Forms身份验证和基于Role的权限验证 从Membership到SimpleMembership再到ASP.NET Identity,ASP.NET每一次更换身份验证的组件,都让我更失望.Memb ...
- ASP.NET:Forms身份验证和基于Role的权限验证
从Membership到SimpleMembership再到ASP.NET Identity,ASP.NET每一次更换身份验证的组件,都让我更失望.Membership的唯一作用就是你可以参考它的实现 ...
- asp.net的forms身份验证 单用户身份验证
asp.net的forms身份验证 单用户身份验证 首先要配置Web.config文件 <system.web> <authentication mode="Forms& ...
- 通过Forms身份验证设置不同页面的访问权限
使用Forms身份验证的时候,如果允许注册页面可以匿名用户访问,其他所有页面只允许注册用户访问,我们可以如下设置web.config文件来达到上述的效果: 1.在“system.web”节点下,添加登 ...
随机推荐
- Java 基础之一对象导论
对象导论 1.1 抽象过程 所有编程语言都提供抽象机制.人们所能解决的问题的复杂性直接取决于抽象的类型和质量. 汇编语言是对底层机器的轻微抽象. 我们将问题空间中的元素及其再解空间中的表示称为对象.这 ...
- Oracle数据库设置为归档模式的操作方法
Oracle归档模式非常非常重要!对于有些数据库刚装好后可能是非归档模式,这是很危险的!为了安全起见,一定要谨记:对于Oracle数据库,一定要设置为归档模式,尤其是生产库,只有这样才能实现数据库的有 ...
- 北航MOOC客户端
我们的团队作业终于完成了,欢迎下载使用我们的北航MOOC手机客户端软件(Android端)——北航学堂,学习北航的公开课程. 安装包下载地址: http://pan.baidu.com/s/1jGvH ...
- SCRUM 12.18
明天就是编译课设的第二次中期考核了,大家都感到有一些压力. 所以我们决定今天减少一些工作量. 工作任务分配依旧如往常 成员 任务 彭林江 落实API 郝倩 研究遍历美团数据方法 牛强 落实意见反馈功能 ...
- 发布阶段 github和360移动助手及总结
经过一系列的冲刺和加工 最激动人心的无非在发布平台上公布上自己辛苦奋斗了一个周期的产品,这个时候的我们就像Iphone 6发布会上得CEO,为自己的产品完美画上了研发的句号. 接下来的日子就是准备ve ...
- HDOJ1287_破译密码
一道正常简单题 曲折解题 做这题的时候看了很久没有看懂是什么意思,最后以为是一道单独的数学题把B这个大写字母猜出来进行异或运算,还不知道C里面异或运算可以直接有符号的:),导致又去学习了一下十进制转换 ...
- 【转】Linux tail 命令详解
Linux tail 命令详解 http://www.2cto.com/os/201111/110143.html
- zabbix 使用问题两个--中文乱码,以及监控ESXi下的虚拟机
1. 中文乱码 最开始中文显现 长方形不显示文字.解决办法: c:\windows\fonts 下面复制 楷体的字体(字体随意看自己喜欢) 文件名一般为: simkai.ttf 2.将simkai.t ...
- [转帖]CR3,PDE,PTE,TLB 内存管理的简单说明
CR3,PDE,PTE,TLB Copy From https://www.cnblogs.com/zzSoftware/archive/2013/02/11/2908824.html 网上关于 ...
- linux 单引号,双引号,反引号的小总结。
还是老惯例说说事情的起因,由于最开始对linux下面的各种引号并不是特别敏感,导致有一天我在添加数据库字段的时候出现的错误,当时出现错误的原因是我在最外层使用了单引号进行包裹,然后一句话里面需要转意的 ...