5

私のアプリケーション (ASP.NET MVC 3) には、すべてのコントローラーが継承する BaseController クラスがあり、その BaseController で OnActionExecuting メソッドをオーバーライドして、他のすべてのアクション メソッドでアクセスする必要があるため、セッション変数が設定されていることを確認しました。アプリケーションで。また、AuthorizeAttributeClass を拡張するカスタム Authorize 属性を定義しました。その属性では、OnAuthorization をオーバーライドして、BaseController の OnActionExecuting メソッドにロードしているのと同じセッション変数をチェックし、ユーザーが続行を許可されているかどうかを確認します。

BaseController

public class BaseController : Controller
{
    private ISessionUserService sessionUserService;

    public BaseController(ISessionUserService sessionUserService)
    {
        this.sessionUserService = sessionUserService;            
    }

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        if (User != null && User.Identity.IsAuthenticated && this.sessionUserService.Current == null)
        {                     
            this.sessionUserService.Start(accountID, User.Identity.Name);                                                                           

            // If we weren't successful in reloading the SessionUser
            // variable, redirect the user to the Sign In view
            if (this.sessionUserService.Current == null)
            {                  
                filterContext.Result = new RedirectResult(Url.Action("SignIn", "Access", new { area = string.Empty }));
                return;
            }
        }
    }

}

カスタム認証属性

public class AuthorizeByPermission : AuthorizeAttribute
{        
    public Permission[] Permissions { get; set; }

    public AuthorizeByPermission(params Permission[] permissions)
    {
        this.Permissions = permissions;
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        SessionUser sessionUser = filterContext.HttpContext.Session.Get<SessionUser>();

        if (sessionUser.HasPermission(Permissions))
            return;

        filterContext.Result = new HttpUnauthorizedResult();
    }
}

問題は、BaseController の OnActionExecuting メソッドが AuthorizeByPermission 属性の OnAuthorization メソッドの後に起動していることです。Authorize 属性がアクセスを試行する前にセッション変数が存在しない場合、BaseController はセッション変数を設定する必要があるため、逆にする必要があります。それ。

基本的に、OnAuthorization メソッドが起動する前に発生するように登録できる基本クラス メソッドまたはグローバル フィルターを使用する方法を見つける必要があります。これを行う方法についてのアイデアはありますか?

GlobalFilter を登録してセッション変数をロードし、その Order プロパティを AuthorizeByPermission 属性よりも低く設定しようとしましたが、それもうまくいかないようでした。

また、BaseController で Execute メソッドをオーバーライドしようとしましたが、実際にはカスタム認証属性の前に起動しましたが、filterContext にアクセスできなかったため、ユーザーを SignIn ページにリダイレクトできなかったことが問題でした。セッション変数をロードします。

bmosh のコメントに従って、BaseController の OnActionExecuting メソッドを別のフィルターに変えて、AuthorizeByPermission 属性よりも小さい Order 番号を持つその属性で BaseController を装飾しようとしましたが、それでも機能しませんでした。

[FilterIWantToFireFirst(Order = 1)]
public class BaseController : Controller
{

}

public class AnotherController : BaseController
{
     [AuthorizeByPermission(Permission.Add, Order = 2)]
     public ActionResult SomeActionMethod() 
     {
     }
}

上記の設定でも、AuthorizeByPermission 属性が最初に発火します。

何か案は?

4

1 に答える 1

4

ベースコントローラーで OnActionExecuting の代わりに OnAuthorization をオーバーライドしてみてください。

于 2011-10-11T13:52:42.463 に答える