4

ほとんどのメソッドにアクセスするために必要な「product_editor」の役割を持つ製品コントローラーがあります。承認を必要としないアクションがいくつかあるため、[AllowAnonymous] はうまく機能します。ただし、ログインしている必要がありますが、製品エディターではない可能性があります。

1 つのアクションに対してこれを宣言する簡単な方法はありますか?

私の試みのいくつかがコメントアウトされているのを見ることができます

[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 });
....
}
4

2 に答える 2

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

または、多くのアクションがある場合は、別のコントローラーで異なるアクションを移動することもできます。

于 2013-07-10T14:35:20.597 に答える
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()
    {
        ...
    }
}
于 2016-06-14T14:03:17.553 に答える