MVC 4表单身份验证无法与[授权]一起使用

时间:2013-05-21 08:44:19

标签: c# asp.net-mvc asp.net-mvc-4 forms-authentication authorize

我现在正在学习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也处于活动状态。

1 个答案:

答案 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