在控制器中授权一个操作但不需要角色

时间:2013-07-10 14:33:11

标签: asp.net-mvc roles authorize

我有一个产品控制器,它具有“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 });
....
}

2 个答案:

答案 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()
    {
        ...
    }
}