私の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 タグがあるにもかかわらず)。
要するに、ログイン要求だけでなく、すべての要求でユーザーを承認したい (これはメンバーシップ プロバイダーが現在行っていることのようです)