ログインへのフォーム認証の自動リダイレクトをバイパスするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/35322

質問

asp.net-mvc を使用して iis6 にデプロイするアプリを作成しています。フォーム認証を使用しています。通常、ユーザーが適切な認証なしにリソースにアクセスしようとした場合、ログイン ページにリダイレクトされるようにしたいと考えています。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 に対してこのインターセプトをバイパスしたいと考えています。

役に立ちましたか?

解決

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

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

HttpForbiddenResult は非常に簡単です。

public class HttpForbiddenResult : ActionResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        context.HttpContext.Response.StatusCode = 0x193; // 403
    }
}

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

他のヒント

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

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

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

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

これは機能するはずです。FormsAuth 属性を記述したのか、それとも他の場所から取得したのかはわかりません。

Preview 4 に付属する AuthorizeAttribute はまだ使用していません。最初の CTP から MVC フレームワークを使用しているため、独自のものを作成しました。リフレクターの属性をざっと見てみたところ、401 に相当する 16 進数を使用していることを除いて、内部的には上で述べたことを行っています。例外がキャッチされた場所を確認するには、呼び出しをさらに調べる必要があります。おそらく、そこがリダイレクトを実行している場所だからです。これはオーバーライドする必要がある機能です。あなたがそれをできるかどうかはまだわかりませんが、Haacked がこれを見て自分で投稿しない限り、見つけたら投稿して回避策を提供します。

いくつかグーグルで調べてみたところ、次のような結果が得られました。


    HttpContext.Current.Response.StatusCode = 401;

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top