12

私のasp.net mvc3アプリケーションには、以下に示すようにカスタム承認属性があります。

public class CustomAuthorize : AuthorizeAttribute
{
    public IAccountRepository AccountRepository { get; set; }

    public CustomAuthorize()
    {
        this.AccountRepository = new UserModel();
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        base.AuthorizeCore(httpContext);
        return AccountRepository.isEnabled(HttpContext.Current.User.Identity.Name);
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    {
        base.HandleUnauthorizedRequest(filterContext);
    }
}

[CustomAuthorize]コントローラーアクションにタグがあり、メソッドAuthorizeCoreは正常に機能します-必要なロジックを実行し(アカウントが実際に有効になっていることを確認します)、そのように戻ります。

ただし、オーバーライドされたHandleUnauthorizedRequestメソッドは、承認されていないリクエストの動作を制御できるようにする必要があると理解していますが、まったく実行されていません。そこにブレークポイントを置き、そこにコードを置き、アプリケーションに無許可でアクセスすると、コードは実行されません。

私は何が欠けていますか?

編集:私はさらに調査を行い、この問題を抱えている他の数人を見つけましたが、残念ながら解決策はありません.

EDIT2: サンプルコード

[CustomAuthorize]
public class UserController: Controller
{
    public UserController() 
    {
        //do stuff here
    }
}

編集3:@ファビオ

これが私がやろうとしていることです。正常に動作するログイン ページ (フォーム認証) があります。カスタム ログインを呼び出してから、AuthorizeCore オーバーライドを呼び出します。私のアプリケーションは大量の ajax 呼び出しを使用します。私の最終的な目標は、ユーザーがアプリケーションを使用しているときにいつでも管理者がそれらを無効にし、無効になった後に (まだログインしているにもかかわらず) ajax 呼び出しを行うことです。ただし、これを行うには、ユーザーが ajax 呼び出しを行っている場合にカスタム応答を返したいと考えています。そのためには、HandleUnauthorizedRequest をオーバーライドする必要があります。しかし、ユーザーがログインしている場合、Authorize Core (および拡張機能の HandleUnauthorizedRequest) は無視されます (ajax が呼び出しているすべてのコントローラー アクションに customauthorize タグがあるにもかかわらず)。

要するに、ログイン要求だけでなく、すべての要求でユーザーを承認したい (これはメンバーシップ プロバイダーが現在行っていることのようです)

4

2 に答える 2

7

私は最終的に自分のアプローチをかなり変えました。個々のアクセス許可チェックを実装したため、AuthorizeCore が毎回呼び出されるようになりました (以前はキャッシュされていなかったと思います)。

興味深いことに、HandleUnauthorizedRequestオーバーライドにブレークポイントを設定しても壊れませんが、メソッド内に配置すると壊れます。奇妙で、ちょっと気が遠くなりましたが、今は解決しました。

誰かが興味を持っている場合のコード:

public class CustomAuthorize : AuthorizeAttribute
{
    public string Permissions { get; set; }

    private IAccountRepository AccountRepository { get; set; }        

    private string[] permArray { get; set; }

    private string reqStatus { get; set; }

    public CustomAuthorize()
    {
        this.AccountRepository = new UserModel();
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        base.AuthorizeCore(httpContext);

        if (Permissions != null) {
            permArray = Permissions.Trim().Split(' ');

            if (AccountRepository.isEnabled(httpContext.User.Identity.Name)) {
                this.reqStatus = "permission";
                return AccountRepository.hasPermissions(permArray);                     
            } else {
                return false;
            }
        } else {
            return AccountRepository.isEnabled(httpContext.User.Identity.Name);
        }
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    {
        if (this.reqStatus == "permission") {
            filterContext.Result = new RedirectResult(MvcApplication.eM.cause("no_permission", "redirect"));
        } else {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

そして、コントローラーをこれで装飾しました:

[CustomAuthorize(Permissions="test_perm")]

于 2012-06-21T19:50:41.620 に答える
2

これはばかげた回答/質問かもしれませんが、AccountRepository.isEnabled メソッドは false を返すので、HandleUnauthorizedRequest を実行できますか?

true を返す場合、HandleUnauthorizedRequest メソッドは実行されません。

于 2012-06-19T15:02:28.637 に答える