我有一个我正在研究的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。
答案 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)