0

何が起こっているのかというと、カスタム認証属性の HandleUnauthorizedRequest メソッドのオーバーライド内に条件があるということです。この時点まで、私は 403 をスローしており、それが検出されてカスタム エラー ページにリダイレクトされます。さて、それは私が本当に欲しいものではありません。私が実際に望んでいるのは、同じログイン ページを表示することですが、検証の概要に「このリソースへのアクセス権がありません。」というメッセージを追加することです。これにより、もう少しユーザー フレンドリーになります。あなたの評判は良かったが、あなたはここに属していないことを示しています。

私はこのようなものがうまくいくと思った:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    // passed authentication, failed authorization
    if (filterContext.HttpContext.User.Identity.IsAuthenticated)
    {           
        filterContext.Controller.ViewData.ModelState.AddModelError("", "Not Authorized");
        return;
    }

    base.HandleUnauthorizedRequest(filterContext);
}

しかし、これは機能していません。何が起こっているかというと、ログイン ページが単にリロードされるだけです。これにより、私は近づいているように感じますが、モデルエラーが表示される必要があります。

何か案は?

更新:ここにエラーを追加しているコントローラーは、実際には、ここにつながった属性を持つアクションのコントローラーであるように思われます。どうにかしてログインコントローラーにエラーを追加する必要があります。それが可能かどうかはわかりません。

4

1 に答える 1

1

ここで基本メソッドを呼び出しています。

base.HandleUnauthorizedRequest(filterContext);

フォーム認証を使用している場合、この基本メソッドは単純にログイン ページにリダイレクトします。また、リダイレクトとは、クライアントからの新しい HTTP リクエストを意味します。現在のコンテキストとそれに保存したものはすべて失われます。より正確に言えば、ベース メソッドは 401 HTTP ステータス コードを返し、これが FormsAuthenticationModule によってインターセプトされ、web.config で定義されたログイン ページにリダイレクトされます。ただし、この実装の詳細は重要ではありません。

あなたができることは、基本メソッドに任せるのではなく、ログインページへのリダイレクトを自分で実行することです。filterContext.ResultプロパティをRedirectToRouteResultインスタンスに設定することでこれを行うことができます。この場合、エラー メッセージをクエリ文字列パラメーターとして渡すことができます。


アップデート:

更新された質問によるとreturn;、ModelState 値を設定した後に呼び出しているようで、基本メソッドを呼び出していないため、ログイン URL へのリダイレクトは発生しません。この場合、 ModelState に保存した値を使用できるビューfilterContext.Resultのインスタンスに を設定することで、エラー ビューを返すことができます。ViewResult

于 2013-07-19T21:17:48.800 に答える