17

[Authorize]アクションを除く、管理コントローラーのすべてのアクションに使用したいと思いLoginます。

[Authorize (Roles = "Administrator")]
public class AdminController : Controller
{
    // what can I place here to disable authorize?
    public ActionResult Login()
    {
        return View();
    }
}
4

4 に答える 4

14

標準の Authorize 属性でこれを行うことはできないと思いますが、許可するアクションのリストを取得し、それらのアクションのみへのアクセスを許可する AuthorizeAttribute から独自の属性を派生させることができます。これを行う方法については、 www.codeplex.comの AuthorizeAttribute のソースを参照してください。もしそうなら、それは次のようになります:

[AdminAuthorize (Roles = "Administrator", Exempt = "Login, Logout") ]
public class AdminController : Controller
{
    public ActionResult Login()
    {
        return View();
    }

    public ActionResult Login()
    {
        return View();
    }

    ... other, restricted actions ...
}

編集:参考までに、私は最終的に自分で似たようなことをする必要性に出くわし、別の方向に進みました. デフォルトの承認フィルター プロバイダーを作成し、グローバル承認フィルターを適用しました。承認フィルター プロバイダーは、リフレクションを使用して、アクションまたはコントローラーに特定の承認属性が適用されているかどうかを確認し、適用されている場合はそれに従います。それ以外の場合は、デフォルトの承認フィルターが適用されます。これは、パブリック アクセスを許可する AuthorizeAttribute から派生した PublicAttribute と組み合わされます。[Public]これで、デフォルトで保護されたアクセスを取得できますが、アクションまたはコントローラーに適用することでパブリック アクセスを許可できます。必要に応じて、より具体的な承認を適用することもできます。http://farm-fresh-code.blogspot.com/2011/04/default-authorization-filter-provider.htmlで私のブログを参照してください。

于 2008-11-30T23:03:00.153 に答える
5

コントローラーの OnAuthorization メソッドをオーバーライドできます

    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        if ((string)(filterContext.RouteData.Values["action"]) == "Login")
        {
            filterContext.Cancel = true;
            filterContext.Result = Login();
        }
    }

これは機能しますが、ハックです。

テストに使用される完全なクラス コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication2.Controllers
{
[HandleError]
[Authorize]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Title"] = "Home Page";
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }


    public ActionResult About()
    {
        ViewData["Title"] = "About Page";

        return View();
    }


    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        if ((string)(filterContext.RouteData.Values["action"]) == "Index")
        {
            filterContext.Cancel = true;
            filterContext.Result = Index();
        }
    }
}
}
于 2008-11-30T23:14:02.097 に答える
1

実際ではないかもしれませんが、カスタム属性を書きました:

public class SelectableAuthorizeAttribute : AuthorizeAttribute
{
    public SelectableAuthorizeAttribute(params Type[] typesToExclude)
    {
        _typesToExlude = typesToExclude;
    }

    private readonly Type[] _typesToExlude;

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        bool skipAuthorization = _typesToExlude.Any(type => filterContext.ActionDescriptor.ControllerDescriptor.ControllerType == type);

        if (!skipAuthorization)
        {
            base.OnAuthorization(filterContext);
        }
    }
}

そして、それを私のグローバルfiletrsに登録しました:

filters.Add(new SelectableAuthorizeAttribute(typeof(MyController)));

それが誰かに役立つことを願っています

于 2012-07-19T05:30:01.733 に答える