2016-04-19 15 views
3

IISの単一のサイトに複数のASP.net MVCアプリケーションがデプロイされています。すべてのアプリケーションがフォーム認証を使用しており、すべてのアプリケーションが同じマシンキーを使用するように構成されています。ASP.net MVCクロスアプリケーションPOSTリクエスト

アプリケーションの1つは、他のアプリケーションへのナビゲーションを提供し、ログイン/ログアウト機能が処理される「ベースサイト」です。ユーザーは、基本サイトにログインして他のアプリケーションを訪問することができ、それでも認証され、意図したとおりに動作します。

共有レイアウトビューのヘッダーにログアウトフォームがあり、ベースサイトに属するコントローラのログアウトアクションに投稿リクエストが送信されます。このフォームをベースサイトから送信すると、ログアウトは正常に機能します。しかし、私は他のサイトのいずれかからフォームを送信しようとすると、私はエラーメッセージが表示されます

"The anti-forgery cookie token and form field token do not match." 

をこれは私のログオフアクションが私のセキュリティコントローラで次のようになります。

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOff() 
    { 
     FormsAuthentication.SignOut(); 

     return Redirect("~/"); 
    } 

この私のフォームは、基地サイトビューで次のようになります。

using (Html.BeginForm("LogOff", "Security", FormMethod.Post, null)) 
       { 
        @Html.AntiForgeryToken() 
        <input type="submit" value="Log Off"/> 
       } 

ディレクトリが設定されている方法の他のサイトは、Bからログアウトアクションを呼び出すために、同じ形のわずかに異なるバージョンを使用しているためase site:

ベースサイトはディレクトリのルートにあり、他のアプリケーションはそのルート内の独自のフォルダに含まれています。

私が試した意見は、矛盾するフォームや偽造防止のトークンがなく、すべてのアプリケーション間でマシンキーが適切に設定されているようです。そうでなければ、認証が全く機能しないと思います。私は基本サイトにリダイレクトしてそこからログアウトアクションを実行することを検討していますが、もう少し単純な解決策がある場合は、それがうまくいくはずです。

+0

Webアプリケーションは1つのソリューションに収まっていますか、またはアプリケーションごとに異なるソリューションがありますか? –

+0

元々彼らは出版されていましたが、元々は異なった解決策にあります。 – pjthomso

+0

異なるタイミングでログオフしようとしましたか?私はあなたがサインしたばかりの瞬間をどこから奪って何が起こったのかを知らせることを意味します。 –

答えて

0

AntiForgeryTokenは、同じトークンを持つ隠しフィールドとCookieを作成することで機能します(this blod post参照)。あなたのフォームは別のURLに投稿されているので、私はそのクッキーがPOSTと共に送信されていないか、あなたのブラウザが以前のリクエストからのクッキーをあなたのベースサイトに持っていて、間違ったものを送信していると思います。この動作は、クッキーを削除した後にも発生しますか(古いものが使用されていないことを確認するため)

+0

Cookieをクリアしてから新しいページを読み込まずにログアウトしようとすると、「必要な偽造Cookie」__RequestVerificationTokenが存在しません。 " Cookieを削除した後に別のページに移動しようとすると、ログインページに送信されます。そのため、Cookieを削除すると、基本的にログアウトされています。 – pjthomso

0

この問題を解決するために私が行ったことは、すべてのコントローラが既に継承していたカスタムコントローラクラスにLogOffアクションを移動することです。

public abstract class BaseController : Controller 
    {   
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult LogOff() 
     { 
      FormsAuthentication.SignOut(); 

      //Redirect to home page when logging off. 
      return Redirect("~/"); 
     } 
    } 

その後は、単純ではなく、ベースサイトのセキュリティコントローラをspecifiyingよりも、現在のコントローラからログオフアクションを呼び出すために私のログアウトフォームを変更:

using (Html.BeginForm("LogOff", "", FormMethod.Post, null)) 
       { 
        @Html.AntiForgeryToken() 
        <input type="submit" value="Log Off"/> 
       } 

Iがあるかどうかわかりません私の元のバージョンが動作するかどうかを判断する方法は、今のところ私はこれと一緒に行くつもりだと思う。

関連する問題