我有一个产品控制器,它具有“product_editor”所需的角色,可以访问大多数方法。有一些不需要授权的操作,因此[AllowAnonymous]工作得很好。但是,我有一个动作,我想要求他们登录,但他们可能不是产品编辑。
是否有一种简单的方法可以为一个动作声明这个?
你可以看到我的几个尝试被注释掉
[Authorize(Roles = "product_editor")]
public class ProductController : Controller
{
#region Public Actions
[AllowAnonymous]
public ActionResult Search(string keyword...
[AllowAnonymous]
public ActionResult Details(string id...
#endregion
//[Authorize]
//[Authorize(Roles="")]
public ActionResult AuthorizedDownload(long id, string step)
{
SecureDownloadLink link = SecureDownloadLink.Load(id);
if(link.belongsTo(HttpContext.Current.User.Identity.Name))
{
//Allow download
}
else
{
//Return 404 Error
}
}
}
- 编辑 -
找到了一个可行的解决方案,但我会喜欢基于属性的解决方案,因为我的其余身份验证都是在属性中完成的,[AllowAnonymous]有点误导。
[AllowAnonymous]
public ActionResult AuthorizedDownload(long id, string step)
{
if (!User.Identity.IsAuthenticated)
return RedirectToAction("Login", "Account", new { ReturnUrl = Request.Url.LocalPath });
....
}
答案 0 :(得分:4)
除了在每个控制器操作上显式明确指定Authorize属性之外,我认为没有一种简单的方法可以实现这一点:
public class ProductController : Controller
{
#region Public Actions
[AllowAnonymous]
public ActionResult Search(string keyword...
[AllowAnonymous]
public ActionResult Details(string id...
#endregion
[Authorize]
public ActionResult AuthorizedDownload(long id, string step)
{
SecureDownloadLink link = SecureDownloadLink.Load(id);
if(link.belongsTo(HttpContext.Current.User.Identity.Name))
{
//Allow download
}
else
{
//Return 404 Error
}
}
[Authorize(Roles = "product_editor")]
public ActionResult SomeOtherAction()
{
...
}
}
或者如果您有许多动作,另一种可能性是在单独的控制器中移动不同的动作。
答案 1 :(得分:0)
授权使用级联规则,因此您可以通过这种方式对其进行简化。
[Authorize]
public class ProductController : Controller
{
#region Public Actions
[AllowAnonymous]
public ActionResult Search(string keyword...
[AllowAnonymous]
public ActionResult Details(string id...
#endregion
public ActionResult AuthorizedDownload(long id, string step)
{
SecureDownloadLink link = SecureDownloadLink.Load(id);
if(link.belongsTo(HttpContext.Current.User.Identity.Name))
{
//Allow download
}
else
{
//Return 404 Error
}
}
[Authorize(Roles = "product_editor")]
public ActionResult SomeOtherAction()
{
...
}
}