2

我开发了一个使用表单身份验证和 cookie 的 MVC4 Web 应用程序。自从我开始(几年)以来,在所有浏览器中它都运行良好。

我现在尝试使用微软虚拟机中的 IE11 测试该站点,但登录过程不起作用。当我单击登录时,没有任何反应,并且我被重定向回登录页面,就好像我没有经过身份验证一样。

起初我以为是因为 cookie 即将过期,但是正如我在临时文件中看到的那样,正在设置 cookie。我的代码似乎没有做任何棘手的事情。

注意:当我将站点添加到兼容性视图时,登录过程有效

这是登录 / Cookie 代码

public void SignIn(HttpResponseBase response, string userName, bool rememberMe)
{
    if (String.IsNullOrWhiteSpace(userName)) 
          throw new ArgumentException("Value cannot be null or empty.", "userName");

    var ticket = new FormsAuthenticationTicket(
                        1, 
                        userName, 
                        DateTime.Now, 
                        DateTime.Now.AddMinutes(FormsAuthentication.Timeout.TotalMinutes), 
                        rememberMe, 
                        string.Empty);

    var cookie = new HttpCookie(
                        FormsAuthentication.FormsCookieName, 
                        FormsAuthentication.Encrypt(ticket));
    cookie.HttpOnly = true;

    if (rememberMe)
    {
        cookie.Expires = ticket.Expiration;
    }

    response.Cookies.Add(cookie);
}

我创建了一个自定义 AuthorizeAttribute,它应该只是委托链,因为我没有通过 ajax 进行登录。

public class OverseerAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext context)
    {
        if (FormsAuthentication.IsEnabled)
        {
            if (context.HttpContext.Request.IsAjaxRequest())
            {
                context.HttpContext.Response.AddHeader("REQUIRES_AUTH", "1");
                context.Result = new EmptyResult();
            }
            else
            {
                base.HandleUnauthorizedRequest(context);
            }
        }
        else
        {
            base.HandleUnauthorizedRequest(context);
        }
    }
}

如果我从控制器中删除 AuthorizeAttribute ,那么系统会尝试登录,但由于没有用户名,它会崩溃。当我把它放回去时,什么也没有发生。

4

1 回答 1

6

尝试在web.config 文件的元素中使用cookieless="UseCookies"属性。forms那应该可以解决问题。阅读此处了解更多信息:

http://gyorgybalassy.wordpress.com/2013/09/23/aspnet-40-forms-authentication-issues-with-ie11/

于 2013-10-24T12:57:06.700 回答