次のようなカスタムAuthorizationFilterを使用します。
_public class ActionAuthorizeAttribute : AuthorizeAttribute {
protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) {
if(!httpContext.User.Identity.IsAuthenticated)
return false;
if(IsUserExcluded())
return false;
else
return IsRoleAuthorize(httpContext);
}
}
_
私が持っている各アクションの上部でこのフィルターを使用します。また、「認証済み」チェックには、アクション名、コントローラー名、およびエリア名が必要です。 use _System.Web.HttpContextBase
_のようなAuthorizeCore()
メソッドでこの名前を取得する方法はありますか?答えがNoの場合、どのようにしてこの名前を取得して属性に渡すことができますか?明らかに、各名前を手動で追加したくないのは、実際にはコントローラの_ViewContext.RouteData.Values["Controller"]
_のようなものです:
_[ActionAuthorize(actionName=Action, controller=ControllerName, area=AreaName)]
public ActionResult Index() {
return View();
}
_
誰もそれについて考えていますか?
RouteDataからそれらを取得できます。
protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
{
var rd = httpContext.Request.RequestContext.RouteData;
string currentAction = rd.GetRequiredString("action");
string currentController = rd.GetRequiredString("controller");
string currentArea = rd.Values["area"] as string;
...
}
ほんの少し前に同じ問題に直面し、私の解決策は次のとおりです。
ActionAuthorizeAttributeクラスで2つの属性を定義します。
public string ControllerName {get;set;}
public string ActionName {get;set;}
コントローラのアクションに注釈を付けながら、それらを指定します。
[ActionAuthorize(Roles="Admin", ContollerName="ControllerName",ActionName="ActionName")]**
public ActionResult Disable(int id)
{
...
}
> namespace dene.kontroller {
> public class daAttribute: AuthorizeAttribute
> {
> private Entities db = new Entities();
> private readonly string[] allowedroles;
> public daAttribute(params string[] roles)
> {
> this.allowedroles = roles;
> }
>
>
> protected override bool AuthorizeCore(HttpContextBase httpContext)
> {
> bool authorize = false;
> foreach (var role in allowedroles)
> {
> if (role == HttpContext.Current.User.Identity.Name)
> {
>
> if (role!= null)
> {
> authorize = true;
> }
> }
>
>
> }
> return authorize;
> }
>
>
> protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
> {
>
> FormsAuthentication.SignOut();
> filterContext.Result = new HttpUnauthorizedResult();
> }
>
> } }
カスタムフィルターを使用している場合、エリアを取得しても機能しません。次に、エリアを取得するために機能します
filterContext.RouteData.DataTokens["area"]