7

我现在正在学习 MVC4,我正在按照 Pro ASP NET MVC4 第 4 版书创建一个 Sports Store 项目。

我一直在 webforms 中开发,我试图弄清楚表单身份验证在 MVC4 中是如何工作的。

这是我所取得的成就:

网络配置

<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();
            }
        }

身份验证提供者:

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 也是活动的。

4

1 回答 1

9

如果控制器操作用[Authorize]属性修饰(就像您的Admin/Index操作一样),如果您在请求中没有有效的表单身份验证 cookie,则您无法调用此操作。

同样在您的Login操作中,成功验证后,您不应返回视图,而应重定向,以便正确设置 cookie 并在后续请求中可用。

以下是未经身份验证的用户尝试访问受保护Admin/Index操作时应该发生的情况。该[Authorize]属性将引发 401 异常,正如您从经典 WebForms 中知道的那样,Forms Authentication 模块将拦截该异常,并且您将被重定向到loginUrlweb.config 中的配置,并通过 ReturnUrl 查询字符串参数传递最初请求的受保护资源。

因此,您必须Login在未使用该属性修饰的帐户控制器上执行操作,[HttpPost]并且该操作应为包含登录视图的视图提供服务。请求将如下所示:

/Account/Login?ReturnUrl=%2Fadmin%2Findex
于 2013-05-21T09:04:45.577 回答