gpt4 book ai didi

asp.net-mvc-3 - 超时在 ASP.Net MVC FormsAuthentication 中不起作用

转载 作者:行者123 更新时间:2023-12-03 14:17:17 26 4
gpt4 key购买 nike

我正在使用 FormsAuthentication,设置 TimeOut 值时遇到问题。

我看过其他一些与此相关的帖子,但它们似乎并不是我的问题,或者建议的解决方案没有帮助。

我的 web.config 有以下内容:

<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn"
timeout="1"
cookieless="UseCookies" />
</authentication>

我在要保护的 Controller 上放置了 AuthorizeAttribute。

我可以查看 .ASPXAUTH cookie(使用 FireCookies),我可以看到它被设置为在登录后 1 分钟内过期。

如果我通过我的代码进行调试,我可以看到 FormsAuthentication.Timeout = 1。

但是我的票似乎没有在 1 分钟内超时。在 1 分钟不活动后,我仍然可以使用 AuthorizeAttribute 浏览到 Controller 。

事实上,我实际上可以使用 FireCookies 删除 .ASPXAUTH cookie,并且我仍然可以使用 AuthorizeAttribute 浏览到 Controller 。

奇怪的是,长时间不活动后(抱歉没有确切的时间 - 我出去吃午饭了!)超时发生并且我被重定向
到登录屏幕。

有任何想法吗?

最佳答案

我也有同样的问题。实际上,这是因为我无法从 javascript 中读取表单例份验证 cookie,过了一段时间 undefined .我只是想知道我是否通过 javascript 进行了身份验证。

后来我发现票已经过期了,但我没有退出(也是。所以我也想解决这个问题)!我看到你的问题没有得到回答,所以我在解决我的问题时保持开放状态半天。以下是我想出的似乎有效的方法。

我的答案是基于这个答案。 https://stackoverflow.com/a/454639/511438由用户 斯科特

这是在我的 ASP.NET MVC 3 项目中。

这是我的登录代码。未显示,它之前的自定义用户身份验证逻辑。这只是设置初始票证。

公共(public)类 FormsAuthenticationService : IFormsAuthentication

public void SignIn(string userName, bool createPersistentCookie, string role)
{
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
1, // version
userName, // user name
DateTime.Now, // created
DateTime.Now.Add(FormsAuthentication.Timeout), // expires
false, // rememberMe?
role // can be used to store roles
);

string encryptedTicket = FormsAuthentication.Encrypt(authTicket);

HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
HttpContext.Current.Response.Cookies.Add(authCookie);
}

在同一个类中,但从 global.asax 访问的静态方法
//-- this is based on https://stackoverflow.com/questions/454616/asp-net-cookies-authentication-and-session-timeouts
internal static FormsAuthenticationTicket RefreshLoginCookie(bool retainCurrentExpiry)
{
HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie == null || authCookie.Value == null)
return null;

FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(authCookie.Value);

DateTime expiryDate = (retainCurrentExpiry ? oldTicket.Expiration : DateTime.Now.Add(FormsAuthentication.Timeout));
HttpContext.Current.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);

var newTicket = new FormsAuthenticationTicket(oldTicket.Version, oldTicket.Name, oldTicket.IssueDate, expiryDate,
oldTicket.IsPersistent, oldTicket.UserData, oldTicket.CookiePath);

HttpCookie newAuthCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(newTicket));
HttpContext.Current.Response.Cookies.Add(newAuthCookie);

return newTicket;

}

全局.asax

我的自定义是 ajax 请求不刷新表单例份验证票。因此,如果您在超时期间坐在那里,ajax 请求会将您注销。如果您希望 ajax 请求保持票证有效,请更改此设置(解决我的 javascript cookie 问题,而不是您的注销不活动问题)。
*(提示,如果您已注销,则登录,但再次返回登录页面,第一次登录可能未在查询字符串中指定 returnUrl)。 *
protected virtual void Application_AuthenticateRequest(Object sender, EventArgs e)
{
HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie == null || authCookie.Value == "")
{
return;
}

bool isAjax = new HttpRequestWrapper(System.Web.HttpContext.Current.Request).IsAjaxRequest();

FormsAuthenticationTicket authTicket;
try
{
//-- THIS IS WHAT YOU WANT
authTicket = FormsAuthenticationService.RefreshLoginCookie(isAjax);
}
catch
{
return;
}

string[] roles = authTicket.UserData.Split(';');
if (Context.User != null) Context.User = new GenericPrincipal(Context.User.Identity, roles);

}

Web.config
这是我设置 session 超时和票证超时的部分
<configuration>
<system.web>
<sessionState mode="InProc" timeout="60" />
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="60" name="ProviderMvcSession" cookieless="UseCookies" />
</authentication>

关于asp.net-mvc-3 - 超时在 ASP.Net MVC FormsAuthentication 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8989749/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com