我现在正在学习MVC4,我正在关注Pro ASP NET MVC4第4版的书来创建一个体育商店项目。
我一直在webforms中开发,我试图找出表单身份验证在MVC4中是如何工作的。
以下是我所取得的成就:
的Web.Config
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880"/> </authentication>
AccountController登录操作:
[HttpPost]
public ActionResult Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (authProvider.Authenticate(model.UserName, model.Password))
{
return Redirect(returnUrl ?? Url.Action("Index", "Admin"));
}
else
{
ModelState.AddModelError("", "Incorrect username or password");
return View();
}
}
else
{
return View();
}
}
Auth Provider:
public bool Authenticate(string username, string password) {
bool result = FormsAuthentication.Authenticate(username, password);
if (result)
{
FormsAuthentication.SetAuthCookie(username, false);
}
return result;
}
我正在设置AuthCookie,现在我想知道,如何保护其他控制器 以及AccountController之外的操作
该应用程序有一个名为AdminController的控制器,您可以在其中编辑产品和 以下{controller / action}
中的产品列表管理/索引
所以,如果我不理解理论,如果用户没有登录AccountController,他们就不能用[Authorize]标签调用动作 声明:
public class AdminController : Controller
{
private IProductRepository repository;
public AdminController(IProductRepository repo)
{
repository = repo;
}
[Authorize]
public ActionResult Index()
{
return View(repository.Products);
}
}
问题是我可以毫无问题地调用管理控制器的索引操作,而不会引入登录。
我需要一些指导来了解其工作原理。我做了一些研究,找不到任何东西,这本书没有涵盖这个主题。
提前致谢。
编辑:我关闭了Chrome浏览器,无需更改任何内容。我正在使用制表符,我猜即使停止并开始调试,cookie也处于活动状态。
答案 0 :(得分:9)
如果控制器操作使用[Authorize]
属性进行修饰(与Admin/Index
操作一样),如果请求中没有有效的表单身份验证cookie,则无法调用此操作。
同样在您的Login
操作中,成功进行身份验证后,您不应返回视图,但应重新定向,以便正确设置Cookie并在后续请求中使用。
以下是未经身份验证的用户尝试访问受保护的Admin/Index
操作时应发生的情况。 [Authorize]
属性将抛出401异常,如您所知,经典WebForms将被Forms Authentication模块拦截,您将被重定向到web.config中配置的loginUrl
,并传递一个ReturnUrl查询字符串参数最初请求的受保护资源。
因此,您必须在帐户控制器上执行Login
操作,该操作未使用[HttpPost]
属性进行修饰,并且应该为包含登录视图的视图提供服务。请求将如下所示:
/Account/Login?ReturnUrl=%2Fadmin%2Findex