为什么我的身份验证cookie没有在MVC 4中设置?

时间:2014-01-25 18:04:42

标签: asp.net-mvc authentication

我有一个我正在研究的MVC4项目。当用户的登录凭证有效时,我调用FormsAuthentication.SetAuthCookie()表示用户已登录。(我将它包装在一个类中,这样我就可以模拟接口进行单元测试。)

namespace FlashMercy.Shared.Security
{
    using System;
    using System.Web.Security;

    public class Auth : IAuth
    {
        public void SetAuthCookie(string userId, bool remember)
        {
            FormsAuthentication.SetAuthCookie(userId, remember);
        }

        public void Signout()
        {
            FormsAuthentication.SignOut();
        }
    }
}

在调试器中,我可以确认.SetAuthCookie(userId, remember)行正在执行,userId 已填充。

然后,我有一个自定义authorize属性来检查用户是否已登录:

namespace FlashMercy.Shared.Security
{
    using System.Web.Mvc;

    public class FlashMercyAuthorizeAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                filterContext.Result = new RedirectResult("/");
            }
        }
    }
}

当我调试应用程序时,即使我已经设置了auth cookie,filterContext.HttpContext.User.Identity.IsAuthenticated也是false。此外,filterContext.HttpContext.User.Identity.Name为空。我不确定我在这里缺少什么。

更新

如果你想看看整个来源,它可以在GitHub上找到:https://github.com/quakkels/flashmercy

3 个答案:

答案 0 :(得分:1)

您的代码问题在于您正在使用FormsAuthentication,但您没有将其添加到web.config。你的web.config应该有这样的部分:

<system.web>
    <authentication mode="Forms"></authentication>
    ...
</system.web>

基于此模式,Asp.Net了解它应该使用哪种身份验证模式,例如:表单,Windows等没有设置它Forms值 - FormsAuthenticationModule只是忽略请求中的.ASPXAUTH cookie。

PS。我已经下载了您的代码,并且在web.config中使用了正确的身份验证部分,它可以正常运行并将HttpContext.User.Identity.IsAuthenticated更新为true。

答案 1 :(得分:0)

问题是您只设置了身份验证cookie,但没有任何加载它的内容。

使用该cookie的表单身份验证。因此,您必须激活表单身份验证,否则您必须自己加载它。

答案 2 :(得分:0)

  

filterContext.HttpContext.User.Identity.IsAuthenticated即使在我设置了auth cookie之后也是假的。

如果您在SetAuthCookie()之后重定向,则情况总是如此。 ASP.Net管道负责在AuthenticateRequest中授权用户(在编写代码之前的大部分时间)。设置Cookie不会更新当前User.Identity,这需要已执行的代码。只要确保你SetAuthCookie()的任何时候你立即重定向(服务器端正常)到另一个URL(无论如何,它可能是分离登录用户的好方法,以及他们下一步应该做什么SRP