我正在尝试使用MVC4网站进行简单的表单身份验证设置。
在App_start / FilterConfig.cs中:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new AuthorizeAttribute());
}
在Web.config中:
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" name=".ASPFORMSAUTH" />
</authentication>
<authorization>
<deny users="?" />
</authorization>
在Controllers / AccountController中:
[AllowAnonymous]
public ActionResult Login()
{
return View("~/Views/MyAccountViews/Login.cshtml");
}
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
ActionResult retVal = View("~/Views/MyAccountViews/Login.cshtml", model);
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
retVal = RedirectToAction("Index", "Home");
}
}
return retVal;
}
现在,当我在Visual Studio中调试它时,它位于基本URL(例如localhost:1111 /)上,它正确地重定向到登录页面(localhost:1111 / Account / Login?ReturnUrl =%2f)
但是,如果我只是将URL修改回localhost:1111 /并按Enter键,我就可以访问该站点了。在这种情况下,httpcontext.current.user.identity.name仍然是我的Windows NT登录名。我已确保调用FormsAuthentication.Logout来清除cookie。如果我登录并将“PersistCookie”设置为true,请不要调用FormsAuthentication.Logout,只是重新启动我的调试会话,我最初仍然会重定向到“登录”页面,但可以通过修改URL来绕过。所以,有和没有cookie的结果相同。如何使用严格的表单身份验证来完成此工作?我做错了什么?
答案 0 :(得分:1)
您需要添加过滤器以检查用户是否经过身份验证/授权。
<强> 1。添加以下属性
public class AuthorizeWithSessionAttribute:AuthorizeAttribute {
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext.Session == null || httpContext.Session["XYZSession"] == null)
return false;
return base.AuthorizeCore(httpContext);
}
}
<强> 2。在SetAuthCookie()
之后设置会话FormsAuthentication.SetAuthCookie(user.UserName,false);
会话[“XYZSession”] =“设置名称/参数”;
第3。在控制器之前设置属性
[AuthorizeWithSessionAttribute]
public class XYZController:Controller