FormsAuthentication.SetAuthCookie函数使用无效

博客指出FormsAuthentication.SetAuthCookie无法改变Request.IsAuthenticated状态,原因可能是web.config中验证模式为windows,解决办法是将验证模式改为Forms,如<authentication mode=\Forms\><forms name=\.ASPXAUTH\ protection=\All\ timeout=\60\ /></authentication>。
FormsAuthentication.SetAuthCookie无法改变Request.IsAuthenticated的状态
其原因可能是web.config中使用的验证模式是windows的,改为如下即可:
<authentication mode="Forms">
            <forms name=".ASPXAUTH" protection="All" timeout="60" />
</authentication>
当 `HttpCookie ticketCookie = Request.Cookies[FormsAuthentication.FormsCookieName];` 中的 `ticketCookie` 偶尔为空值时,可能由多种原因导致,以下是一些可能的解决方案: ### 1. 检查 Cookie 是否过期 Cookie 有过期时间,如果过期,客户端将不再发送该 Cookie 到服务器。可以在设置 Cookie 时,确保设置合适的过期时间。参考引用中关于设置过期时间的示例如下: ```csharp HttpCookie newcookie = new HttpCookie("username"); newcookie.Value = "oys"; newcookie.Expires = DateTime.Now.AddDays(1); // 设置 Cookie 一天后过期 Response.AppendCookie(newcookie); ``` 在代码中可以这样设置 FormsAuthentication 的 Cookie 过期时间: ```csharp FormsAuthenticationTicket ticket = new FormsAuthenticationTicket( 1, // 版本号 "username", // 用户名称 DateTime.Now, // 创建时间 DateTime.Now.AddDays(1), // 过期时间 true, // 是否持久化 "userData" // 用户数据 ); string encryptedTicket = FormsAuthentication.Encrypt(ticket); HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); authCookie.Expires = ticket.Expiration; Response.Cookies.Add(authCookie); ``` ### 2. 检查 Cookie 路径和域 Cookie 有路径和域的限制,如果路径或域不匹配,客户端不会发送该 Cookie。确保设置 Cookie 时路径和域正确。例如: ```csharp HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); authCookie.Path = FormsAuthentication.FormsCookiePath; authCookie.Domain = FormsAuthentication.CookieDomain; authCookie.Expires = ticket.Expiration; Response.Cookies.Add(authCookie); ``` ### 3. 检查浏览器设置 某些浏览器设置可能会阻止 Cookie 的使用。可以提示用户检查浏览器的 Cookie 设置,确保允许接受 Cookie。 ### 4. 检查是否被删除 在代码中可能存在删除 Cookie 的操作,导致 Cookie 丢失。参考引用中关于删除 Cookie 的示例如下: ```csharp // 删除整个 cookie,设置 cookie 日期过期 HttpCookie cookie = Request.Cookies.Get(FormsAuthentication.FormsCookieName); if (cookie != null) { cookie.Expires = DateTime.Now.Add(new TimeSpan(0, -3, 0, 0)); Response.Cookies.Add(cookie); } ``` 确保代码中没有意外删除该 Cookie 的操作。 ### 5. 检查请求是否跨域 如果请求是跨域的,浏览器可能会阻止发送 Cookie。可以考虑使用 CORS(跨域资源共享)来解决跨域问题。 ### 6. 检查是否重定向丢失 Cookie 在重定向过程中,可能会丢失 Cookie。可以确保在重定向时正确处理 Cookie。例如: ```csharp Response.Redirect("newPage.aspx", false); HttpContext.Current.ApplicationInstance.CompleteRequest(); ``` ### 示例代码 ```csharp // 设置 Cookie FormsAuthenticationTicket ticket = new FormsAuthenticationTicket( 1, "username", DateTime.Now, DateTime.Now.AddDays(1), true, "userData" ); string encryptedTicket = FormsAuthentication.Encrypt(ticket); HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); authCookie.Path = FormsAuthentication.FormsCookiePath; authCookie.Domain = FormsAuthentication.CookieDomain; authCookie.Expires = ticket.Expiration; Response.Cookies.Add(authCookie); // 获取 Cookie HttpCookie ticketCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; if (ticketCookie == null) { // 处理 Cookie 为空的情况 // 例如重新登录 FormsAuthentication.RedirectToLoginPage(); } ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值