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

栏目: ASP.NET · 发布时间: 5年前

内容简介:http://stackoverflow.com/questions/8989749/timeout-not-working-in-asp-net-mvc-formsauthentication

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

我看过一些与此有关的其他帖子,但它们似乎并不完全符合我的问题,或者解决方案没有帮助.

我的web.config具有以下内容:

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

我把一个AuthorizeAttribute放在我想要保护的控制器上.

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

如果我调试我的代码,我可以看到FormsAuthentication.Timeout = 1.

不过我的门票在1分钟内似乎没有超时. 1分钟不活动后,我仍然可以使用AuthorizeAttribute浏览到控制器.

实际上我实际上可以使用FireCookie删除.ASPXAUTH cookie,我仍然可以使用AuthorizeAttribute浏览到控制器.

在很长一段时间后,很奇怪的(抱歉没有一个确切的时间 – 我出去吃午饭了)TimeOut发生了,我被重定向

到登录屏幕.

有任何想法吗?

我也有同样的问题.其实呢,是因为我无法从javascript读取表单认证cookie,这是一段时间未定义的.我只想知道我是否通过javascript进行身份验证.

后来我发现这张票已经过期,但我没有注销(也是,所以我也想解决)!我看到你的问题没有得到回答,所以当我解决问题半天的时候,我保持开放.以下是我想出的,似乎是工作.

我的答案是基于这个答案. http://stackoverflow.com/a/454639/511438 由用户ScottS

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

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

public class 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 http://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;

}

Global.asax中

我的自定义是ajax请求不刷新表单身份验证票证.所以如果你坐在那里的超时时间,一个ajax请求将会注销你.更改,如果你想要ajax请求保持机票活着(解决我的JavaScript cookie问题,而不是你的注销不活动问题).

*(提示,如果您注销,然后登录,但再次回到登录页面,第一次登录也没有在querystring中指定一个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文件

这里是我设置会话超时和机票超时的部分

<configuration>
    <system.web>
        <sessionState mode="InProc" timeout="60" />
        <authentication mode="Forms">
            <forms loginUrl="~/Account/Login" timeout="60" name="ProviderMvcSession" cookieless="UseCookies" />
        </authentication>

http://stackoverflow.com/questions/8989749/timeout-not-working-in-asp-net-mvc-formsauthentication


以上所述就是小编给大家介绍的《asp.net-mvc-3 – 超时在ASP.Net MVC FormsAuthentication中不起作用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

谷歌时代的柏拉图

谷歌时代的柏拉图

[美] 丽贝卡·戈尔茨坦 / 李鹏程 / 中信出版集团·新思文化 / 2017-12-10 / 69.00元

我愿意用我所有的科技去换取和苏格拉底相处的一个下午。 ——史蒂夫•乔布斯 谷歌时代,科技昌明,众声喧哗,哲学提出的许多问题,科学似乎都已经给出了答案。若是如此,为什么我们今天还需要哲学?这个由古希腊城邦时代的哲人苏格拉底和柏拉图开创的学科,真的过时了吗? 已经2400岁 的柏拉图对此有话要说。哲学家兼小说家、美国国家人文奖章获得者戈尔茨坦史海钩沉,从经典著作中复活了柏拉图,让他来......一起来看看 《谷歌时代的柏拉图》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具