コントローラに対して[Authorize]を有効にすることはできますが、単一のアクションに対しては無効にできますか?
-
11-07-2019 - |
質問
Login
アクションを除く、管理コントローラーのすべてのアクションに [Authorize]
を使用したいと思います。
[Authorize (Roles = "Administrator")]
public class AdminController : Controller
{
// what can I place here to disable authorize?
public ActionResult Login()
{
return View();
}
}
解決
標準の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
他のヒント
[Authorize]でコントローラーを装飾し、[AllowAnonymous]で免除するメソッドを装飾することができます
コントローラーの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();
}
}
}
}
実際ではないかもしれませんが、カスタム属性を書きました:
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);
}
}
}
そして、それをグローバルファイルに登録しました:
filters.Add(new SelectableAuthorizeAttribute(typeof(MyController)));
誰かに役立つことを願って