rak*_*los 11 asp.net-mvc session forms-authentication session-cookies
我有这样的代码,当用户被授权时运行:
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
1,
email,
DateTime.Now,
DateTime.Now.AddMinutes(120),
true,
userData);
string encTicket = FormsAuthentication.Encrypt(authTicket);
HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
faCookie.Expires = authTicket.Expiration;
Response.Cookies.Add(faCookie);
Run Code Online (Sandbox Code Playgroud)
然后我重定向到具有Authrize属性的控制器/ Action:
[Authorize]
public class ProductsController : Controller
{
Run Code Online (Sandbox Code Playgroud)
我在web.config中有以下内容:
<authentication mode="Forms">
<forms loginUrl="~/Home/Unauthorized" timeout="2880" />
</authentication>
<sessionState timeout="120"></sessionState>
Run Code Online (Sandbox Code Playgroud)
然而,用户抱怨会话超时或在几分钟不活动后重定向家庭/未授权.
什么可能导致这种情况,我还应该检查什么?
Tom*_*mmy 18
在我为您的登录过期的可能解决方案之前做了几点想法.首先,FormsAuthentication cookie和SessionState完全是两个不同的东西.您可以拥有一个或另一个,或两者兼而有之.因此,这两个项目的超时也没有关系.
FormsAuthentication cookie是一个加密的cookie,包含一些基本信息,例如用户名和到期值.一旦用户通过身份验证,.NET应用程序就会使用此cookie,以了解用户是否已获得某些资源的授权.
控制FormsAuthentication cookie的加密和解密的是IIS上该Web应用程序的MachineKey.MachineKey是一组用于加密和解密cookie的密钥.默认情况下,IIS上的Web应用程序设置为AutoGenerate机器密钥.这意味着当应用程序启动时,会生成随机机器密钥.如果应用程序回收,您将获得一个新的机器密钥.此外,如果您在共享提供程序上托管,则Web主机通常会使您的应用程序负载平衡,这意味着由多个服务器托管.这些服务器中的每一个都将自动生成机器密钥.
如果Web应用程序处于负载平衡方案,则Web场中的每台计算机都无法解密另一台加密的cookie.这将给出"被注销"的外观.这样的示例是登录Web服务器A,然后后续请求转到Web服务器B. Web服务器B不与Web服务器A共享机器密钥,并且无法解密cookie,将用户发送回登录页面.
解决方案是在web.config中定义MachineKey部分,以便IIS的每个实例都使用相同的密钥,如果应用程序池循环使用,您仍然拥有相同的机器密钥.
这是一个可以放在web.config中的示例机器密钥(使用.NET 2.0版本)
<system.web>
<machineKey validationKey="EBC1EF196CAC273717C9C96D69D8EF314793FCE2DBB98B261D0C7677C8C7760A3483DDE3B631BC42F7B98B4B13EFB17B97A122056862A92B4E7581F15F4B3551"
decryptionKey="5740E6E6A968C76C82BB465275E8C6C9CE08E698CE59A60B0BEB2AA2DA1B9AB3"
validation="SHA1" decryption="AES" />
</system.web>
Run Code Online (Sandbox Code Playgroud)
另外的想法是你的web.config(2880)中的到期以及你实际设置的到期时间(120)不匹配.您可能希望它们都匹配.
归档时间: |
|
查看次数: |
11128 次 |
最近记录: |