2017-11-25 7 views
3

エラーメッセージが意味することを理解していますが、クッキーは無効です。しかし、私はこのシナリオを優雅に扱おうとしています。'Window'から 'localStorage'プロパティを読み取ることができません

私はMVC Coreを使用していますが、ここでは何が起こるのですか? Googleなどのサードパーティ認証を使用しようとするとクッキーが無効になると、私のウェブサイトは白いページを読み込み、コントローラには決してヒットしません。クッキーが無効になっているかどうかを確認するためにコントローラをチェックしたかったのですが、それは決して遠くに届きません。

オンラインで掘り下げることで、Cookieが無効かどうかを確認する唯一の方法は、Cookieを設定し、別のページにリダイレクトしてCookieを読み取ることです。しかし、MVCコアでは、それを行うことさえできないようです。

ValidateAntiForgeryアトリビュートがAuthorizeFilterであり、そのことを実行しようとしていて、クッキーを読み取れない可能性があります。しかし、ここで本当に奇妙なのは、私のグローバルなエラー処理がそれを捕まえないということです。私もエラーページを取得していない、私はちょうど白いページを取得します。

これを回避するには?

EDIT:

だから私が行っているテストはChromeでいたし、それが動作です。 IE 11でこれを試してみると、私はGoogleのページに私を蹴ります。なぜChromeはどうですか?

EDIT 2:

私はValidateAntiForgery属性を削除した場合、私は何の問題もありません。

コード:

var schemes = await SchemeProvider.GetAllSchemesAsync(); 
var loginProviders = schemes.ToList(); 
if (loginProviders.Any()) 
{ 
    <form id="form-login" asp-controller="Login" asp-action="ExternalLogin" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post"> 
     @{ 
      var provider = loginProviders.FirstOrDefault(t => t.Name.Equals("Google")); 
     } 
     @if (provider != null) 
     { 
      <input type="hidden" name="provider" value="@provider.Name"/> 
     } 
    </form> 
} 

OUTPUT:

<form id="form-login" method="post" action="/MySite/Login/ExternalLogin"> 
    <input type="hidden" name="provider" value="Google"> 
    <input name="__RequestVerificationToken" type="hidden" value="CfDJ8H5fggDmaa5Alubd0Uq6Sdi5ck0sJteuBr7cgnyqRX_x9_U4CTZzOB-2iiToQ6dyugjPgirRWnfazcgRXwvFIn5xMyLUVAd9wSG_CgLGtKWjgG0X8_SKfWwMFQiww3UfHHE04PPxbdIovktDrMu1BR4"> 
</form> 

それをアクティブにするために、私はJavaScriptから簡単なonclickのを持っている:

$("#login").on('click', function (e) { 
    e.preventDefault(); 
    $("#form-login").submit(); 
}); 
+0

は、私は、この問題に関してで見つけgithubの上で発見された問題がいくつかあります。あなたが 'GET'でそれを使用しているなら、あなたは間違っています。 –

+0

@CamiloTerevintoはい投稿に載っています。これはユーザーをGoogleにリダイレクトする投稿をしようとすると発生します。 – Bojan

+1

何が起こっているのかを確認するためのコードとスクリーンショットを投稿してください。 –

答えて

0

私は理由として、更新を提供したかったですこれは私が考え出したように起こります。 ValidateAntiForgeryAttributeが起動されると、ValidateAntiForgeryFilterが呼び出されます。そのフィルタには、検証が失敗した場合にtry-catchがあります。 catchが呼び出されると、新しいBadRequestが作成されます。

ここで問題は、このBadRequestが起動時に注入したグローバル処理フィルタによって捕捉されないということです。これは、コアフレームワーク自体の問題です。

一時的に解決するために、私はValidateAntiForgeryAttributeとValidateAntiForgeryFilterを書き直し、try/catchを削除しました。これは私のページにエラーが発生し、理想的な解決策ではないにもかかわらず、ユーザーのためにその白いページを生成することはありませんが、私はグローバルエラーハンドラで識別し、 ValidateAntiForgeryToken`だけ `POST`シナリオで使用される` - FYIと同じように

https://github.com/aspnet/Home/issues/2190
https://github.com/aspnet/Mvc/issues/6678

関連する問題