C# MVC 4表单身份验证不使用[授权]
我现在正在学习MVC4,我正在按照专业ASP网络MVC4第四版的书创建一个体育商店项目 我一直使用webforms进行开发,我试图弄清楚表单身份验证在MVC4中是如何工作的 以下是我取得的成就: Web.Config 身份验证提供程序: 我正在设置AuthCookie,现在我想知道如何保护其他控制器 以及AccountController之外的操作 该应用程序有一个名为AdminController的控制器,您可以在其中编辑产品和 以下{controller/action}下的中的产品列表 管理员/索引 因此,如果我没有误解这个理论,如果用户没有登录AccountController,他们就不能使用[Authority]标记调用操作 关于声明:C# MVC 4表单身份验证不使用[授权],c#,asp.net-mvc,asp.net-mvc-4,forms-authentication,authorize,C#,Asp.net Mvc,Asp.net Mvc 4,Forms Authentication,Authorize,我现在正在学习MVC4,我正在按照专业ASP网络MVC4第四版的书创建一个体育商店项目 我一直使用webforms进行开发,我试图弄清楚表单身份验证在MVC4中是如何工作的 以下是我取得的成就: Web.Config 身份验证提供程序: 我正在设置AuthCookie,现在我想知道如何保护其他控制器 以及AccountController之外的操作 该应用程序有一个名为AdminController的控制器,您可以在其中编辑产品和 以下{controller/action}下的中的产品列表 管理
public class AdminController : Controller
{
private IProductRepository repository;
public AdminController(IProductRepository repo)
{
repository = repo;
}
[Authorize]
public ActionResult Index()
{
return View(repository.Products);
}
}
问题是,我可以调用管理员控制器的索引操作,而不会出现任何问题,也不会引入登录
我需要一些指导来了解它是如何工作的。我做了一些研究,没有发现任何东西,这本书没有涉及这个主题
提前谢谢
编辑:我关闭了Chrome浏览器,没有做任何更改。我正在使用选项卡,我猜cookie处于活动状态,甚至停止和开始调试。如果控制器操作用
[Authorize]
属性修饰(就像您的管理/索引
操作一样),如果请求中没有有效的表单身份验证cookie,则无法调用此操作
同样,在您的登录
操作中,成功验证后,您不应返回视图,但应重定向到别处,以便正确设置cookie并在后续请求中可用
以下是未经身份验证的用户尝试访问受保护的Admin/Index
操作时应该发生的情况。[Authorize]
属性将抛出一个401异常,正如您从经典WebForms中了解到的那样,表单身份验证模块将拦截该异常,并将您重定向到web.config中配置的loginUrl
,并传递一个返回URL查询字符串参数,即最初请求的受保护资源
因此,您必须在帐户控制器上有一个登录
操作,该操作没有使用[HttpPost]
属性修饰,并且应该服务于包含登录视图的视图。请求将如下所示:
/Account/Login?ReturnUrl=%2Fadmin%2Findex
您使用的是哪个Visual Studio版本?2010年还是2012年?废话,我关闭了浏览器并清理了缓存,现在它可以正常工作,没有任何变化是的,也许你在上一次会议上留下了一些表单验证cookies。你是唯一一个帮助和解释得很好的人。所以我接受了这个答案。多谢各位much@DarinDimitrov-请您进一步详细说明:“同样在登录操作中,在成功验证后,您不应返回视图,但应重定向到别处,以便正确设置cookie…”?为什么返回视图而不重定向不设置身份验证cookie?
public bool Authenticate(string username, string password) {
bool result = FormsAuthentication.Authenticate(username, password);
if (result)
{
FormsAuthentication.SetAuthCookie(username, false);
}
return result;
}
public class AdminController : Controller
{
private IProductRepository repository;
public AdminController(IProductRepository repo)
{
repository = repo;
}
[Authorize]
public ActionResult Index()
{
return View(repository.Products);
}
}
/Account/Login?ReturnUrl=%2Fadmin%2Findex