web-dev-qa-db-ja.com

HTTPヘッダーが送信された後、サーバーがヘッダーを追加できない@ Html.AntiForgeryで例外

以下のコードを適用してReturnUrlにリダイレクトしようとしていたasp.net mvc 5アプリケーションを開発しています。

[HttpPost]
[AllowAnonymous]
public ActionResult Login(UserLogin model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        string EncryptedPassword = GetMD5(model.Password);
        if (DataAccess.DAL.UserIsValid(model.Username, EncryptedPassword))
        {
            FormsAuthentication.SetAuthCookie(model.Username, true);
            if (String.IsNullOrEmpty(returnUrl))
            {
                return RedirectToAction("Index", "Home");
            }
            else
            {
                Response.Redirect(returnUrl);
            }
        }
        else
        {
            ModelState.AddModelError("", "Invalid Username or Password");
        }
    }
    return View();
}

上記のコードは正常に機能していますが、問題は、ログインフォームを投稿すると、以前に直面したことのない例外が発生し、Login.cshtmlのビューで生成されている例外を解決するのが難しいことです、ラインで:

@Html.AntiForgeryToken()

そして、それがスローする例外:

HTTPヘッダーが送信された後、サーバーはヘッダーを追加できません。

私は多くのことを研究しましたが、結論に達することができません。 @ Html.AntiForgeryToken()行を削除するとアプリケーションは正常に動作しますが、これを行いたくないので、クロスサイトリクエストを保護したままにしておきたいです。

誰でも私を助けてください、この例外を取り除くにはどうすればよいですか?

26
Bilal Ahmed

Response.Redirect(anyUrl)の場合、ステータスコードは302に設定され、ヘッダーが応答に追加されます。

_HTTP 1.0 302 Object Moved 
Location: http://anyurl.com
_

そして、ViewResultが実行され、かみそりがビューをレンダリングすると、Html.AntiForgeryToken()が呼び出されるので、ヘルパーはヘッダー_X-Frame-Options_といくつかのCookieを応答に追加しようとします。例外の。

ただし、_X-Frame-Options_ヘッダーの追加を抑制できるので、この_AntiForgeryConfig.SuppressXFrameOptionsHeader = true;_を_Application_start_に入れるだけでかまいません。

ただし、これを変更することをお勧めします。

_Response.Redirect(returnUrl);
_

_return Redirect(returnUrl);
_

.NETコードが開かれたので、AntiForgeryTokenがどのように機能するかを見ることができます。ここを参照してください AntiForgeryWorker

63

Response.Redirect(returnUrl)で同じエラーが発生していました。 Response.Redirect(returnUrl, false)に変更した後、問題を修正しました。

9
user3208246