And*_*ena 10 .net c# asp.net authentication forms-authentication
我在ASP.NET应用程序中使用表单身份验证.我将其配置FormsAuthenticationTicket为在1年后到期,但实际上在1小时左右后到期.我无法弄清楚为什么.
以下是登录过程中涉及的所有代码:
public static bool Login(int id)
{
try
{
string securityToken = UserHelper.AuthenticateUser(id);
DateTime expiryDate = DateTime.Now.AddYears(1);
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1, id.ToString(), DateTime.Now, expiryDate, true,
securityToken, FormsAuthentication.FormsCookiePath);
string encryptedTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
cookie.Expires = expiryDate;
HttpContext.Current.Response.Cookies.Add(cookie);
return true;
}
catch
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
Web.config文件:
<system.web>
<machineKey validationKey="AutoGenerate"
decryptionKey="AutoGenerate" validation="SHA1" />
<compilation debug="true">
<authentication mode="Forms">
<forms loginUrl="~/Login.aspx" timeout="2880"/>
</authentication>
...
Run Code Online (Sandbox Code Playgroud)
我的方法有问题吗?为什么到期如此之快?
编辑
Global.asax代码:
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
if (Request.PhysicalPath.EndsWith(".aspx") || Request.PhysicalPath.EndsWith(".axd") || Request.PhysicalPath.EndsWith(".ashx"))
SecurityManager.SetPrincipal();
}
Run Code Online (Sandbox Code Playgroud)
SetPrincipal代码:
public static void SetPrincipal()
{
ILivrePrincipal principal = null;
FormsIdentity identity;
UrlParameters urlParameters = UrlParametersHelper.GetUrlParameters(HttpContext.Current.Request);
if (HttpContext.Current.Request.IsAuthenticated)
{
identity = (FormsIdentity)HttpContext.Current.User.Identity;
User userProfile;
urlParameters.SecurityToken = (((FormsIdentity)identity).Ticket).UserData;
try
{
userProfile = UserHelper.GetUser(urlParameters.SecurityToken);
UserHelper.UpdateLastActiveOn(userProfile);
principal = new AuthenticatedPrincipal(identity, userProfile);
}
catch
{
//TODO: Log an exception
FormsAuthentication.SignOut();
principal = new AnonymousPrincipal(new GuestIdentity(), UserHelper.GetUser(null));
}
}
else
{
principal = new AnonymousPrincipal(new GuestIdentity(), UserHelper.GetUser(null));
}
HttpContext.Current.User = principal;
}
Run Code Online (Sandbox Code Playgroud)
这是你的问题.
<machineKey validationKey="AutoGenerate"
decryptionKey="AutoGenerate"
validation="SHA1"/>
Run Code Online (Sandbox Code Playgroud)
每次应用程序池回收时,ASP都会生成一个新的机器密钥.每小时都可能发生这种情况.
机器密钥用于加密和解密FormsAuthentication cookie.如果它发生变化,浏览器上的cookie就不再有用了.因此,系统会将您视为从未登录过.
尝试生成静态密钥并将其添加到配置文件中.应该看起来像这样:
<machineKey
validationKey="21F090935F6E49C2C797F69(snip)F1B72A7F0A281B"
decryptionKey="ABAA84D7EC4BB56D75D(snip)B8BF91CFCD64568A145BE59719F"
validation="SHA1"
decryption="AES"
/>
Run Code Online (Sandbox Code Playgroud)
在这里生成一把钥匙.
| 归档时间: |
|
| 查看次数: |
2472 次 |
| 最近记录: |