我正在使用AuthorizeAttribute来确保当前用户未经授权时我的控制器操作不会运行。这适用于GET请求。如果用户未获得授权,则会将其重定向到登录视图。
但是,这不适用于POST请求,因为浏览器在POST期间不会被重定向。
普遍认同的解决方案是禁止用户在未经授权的情况下到达生成POST请求的应用程序部分。虽然这种逻辑是有道理的,但我认为它并不包含所有真实场景。
考虑在两个选项卡中打开Web应用程序。用户在两个选项卡中都已登录并获得授权,并且正在查看内容,这些内容在单击时可以发起POST请求。然后,用户从一个选项卡中签名并返回登录页面。另一个选项卡不知道此事件已发生。然后,用户从第二个选项卡发起POST请求。
如何在这种情况下优雅地将它们重定向到登录页面?
答案 0 :(得分:1)
我相信你是不对的。我有一个自定义博客(仍需要大量工作),我使用Admin控制器上的[Authorize]属性。该控制器处理博客文章。
我测试了你的情景:
当它试图发布时,我将我重定向到登录屏幕。
[Authorize]
public class AdminController : BaseController
{
public ActionResult Post(int? id)
{
if (id != null)
{
var blogPost = _blogService.RequestPost((int)id);
var blogPostViewModel = _blogPostViewModelMapper.CreateViewModel(blogPost);
return View(blogPostViewModel);
}
return View();
}
//
// POST: /Post/
[HttpPost]
public ActionResult Post(BlogPostViewModel blogPost)
{
var stringTags = blogPost.Tags.Split(',');
var tagIds = _blogTagMapper.MapStringsToIds(stringTags);
blogPost.TagIds = tagIds;
_blogService.SaveBlogPost(BlogPostlMapper.CreateEntity(blogPost));
return RedirectToAction("Index", "Home");
}
}