6

iis6 に展開する asp.net-mvc を使用してアプリを作成しています。フォーム認証を使用しています。通常、ユーザーが適切な承認なしにリソースにアクセスしようとすると、ログイン ページにリダイレクトする必要があります。FormsAuth はこれを簡単に実行してくれます。

問題: 現在、コンソール アプリからアクションにアクセスしています。リクエストをログインページにリダイレクトする代わりに、ステータス 401 でこのアクションを応答させる最も簡単な方法は何ですか?

コンソール アプリが透過的ではなく、この 401 StatusCode に反応できるようにしたいと考えています。また、デフォルトのままにして、不正なリクエストをログイン ページの動作にリダイレクトしたいと思います。

注: テストとして、これを global.asax に追加しましたが、フォーム認証をバイパスしませんでした:

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
    HttpContext.Current.SkipAuthorization = true;
}

@デールとアンディ

MVC プレビュー 4 で提供されている AuthorizeAttributeFilter を使用しています。これは HttpUnauthorizedResult を返しています。この結果は、statusCode を 401 に正しく設定しています。問題は、私が理解しているように、asp.net が応答を傍受し (401 としてタグ付けされているため)、単に通過させるのではなく、ログイン ページにリダイレクトしていることです。特定の URL に対してこのインターセプトをバイパスしたい。

4

5 に答える 5

5

わかりました、私はこれを回避しました。カスタム ActionResult (HttpForbiddenResult) とカスタム ActionFilter (NoFallBackAuthorize) を作成しました。

リダイレクトを回避するために、HttpForbiddenResult はステータス コード 403 で応答をマークします。 FormsAuthentication はこのコードで応答をキャッチしないため、ログイン リダイレクトは事実上スキップされます。NoFallBackAuthorize フィルターは、付属の Authorize フィルターと同様に、ユーザーが承認されているかどうかを確認します。アクセスが拒否された場合に HttpForbiddenResult を返す点が異なります。

HttpForbiddenResult は非常に簡単です。

パブリック クラス HttpForbiddenResult : ActionResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        if (コンテキスト == null)
        {
            新しい ArgumentNullException("context") をスローします。
        }
        context.HttpContext.Response.StatusCode = 0x193; // 403
    }
}

FormsAuthenticationModule でログイン ページのリダイレクトをスキップすることはできないようです。

于 2008-08-30T00:36:31.093 に答える
1

面倒かもしれませんが(そしてうまくいかないかもしれません)、ログインページでRequest.QueryString["ReturnUrl"] != null設定されているかどうかを確認してくださいResponse.StatusCode = 401

何らかの方法でコンソール アプリを認証する必要があることに注意してください。無料で HTTP 基本認証を取得することはできません。自分でロールバックする必要がありますが、多くの実装があります。

于 2008-08-30T00:38:02.850 に答える
0

プレビュー4に含まれているAuthorizeAttributeをまだ使用していません。最初のCTPからMVCフレームワークを使用しているので、自分でロールしました。リフレクターの属性をざっと見てみましたが、401に相当する16進数を使用していることを除いて、内部で上記のことを実行しています。おそらくそれは彼らがリダイレクトをしているところです。これは、オーバーライドする必要がある機能です。まだできるかどうかはわかりませんが、Haackedがこれを見て自分で投稿しない限り、見つけたら投稿して回避策を提供します。

于 2008-08-29T22:23:37.403 に答える
0

アクションに独自の FormsAuth 属性を記述しましたか? その場合、OnActionExecuting メソッドで FilterExecutingContext が渡されます。これを使用して 401 コードを返すことができます。

public class FormsAuth : ActionFilterAttribute
{
    public override void OnActionExecuting(FilterExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.StatusCode = 401;
        filterContext.Cancel = true;
    }
}

これはうまくいくはずです。FormsAuth 属性を記述したのか、それとも別の場所から取得したのかはわかりません。

于 2008-08-29T21:33:07.010 に答える
-2

私はいくつかのグーグルを行いましたが、これが私が思いついたものです:


    HttpContext.Current.Response.StatusCode = 401;

動作するかどうかわからないので、テストしていません。いずれにせよ、試してみる価値はありますよね?:)

于 2008-08-29T21:28:12.950 に答える