2016-04-19 15 views
3

Ich habe mehrere ASP.net MVC-Anwendungen auf einer einzigen Website in IIS bereitgestellt. Alle Anwendungen verwenden die Formularauthentifizierung und alle Anwendungen sind so konfiguriert, dass sie denselben Maschinenschlüssel verwenden.ASP.NET MVC Cross-Anwendung POST-Anfrage

Eine der Anwendungen ist eine "Basis-Site", die die Navigation zu den anderen Anwendungen ermöglicht und in der die Anmelde-/Abmeldefunktionen verarbeitet werden. So wie es aussieht, kann sich ein Benutzer bei der Basis-Site anmelden und die anderen Anwendungen besuchen und sie werden weiterhin authentifiziert, was wie beabsichtigt funktioniert.

Ich habe ein Logout-Formular in der Kopfzeile meiner freigegebenen Layout-Ansichten, die eine Post-Anfrage an die Abmeldung Aktion in einem Controller der Basis-Site übermittelt. Wenn ich dieses Formular von der Basis-Site aus absende, funktioniert die Abmeldung wie erwartet. Aber wenn ich versuche, die Form von einem der anderen Seiten einreichen, erhalte ich die Fehlermeldung:

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

Dies ist, was Aktion mein Abmelde sieht aus wie in meinem Sicherheits-Controller:

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

     return Redirect("~/"); 
    } 

Diese ist das, was meine Form wie in der Basisstations-Ansicht sieht:

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

den Weg Da die Verzeichnisse die anderen Standorte up verwenden eine etwas andere Version der gleichen Form rufen Sie die Abmeldung von der b gesetzt sind ase Website:

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

Die Basisstelle ist an der Wurzel des Verzeichnisses und die anderen Anwendungen werden in einem eigenen Ordner innerhalb dieser Wurzel enthält.

Keine der Ansichten, die ich versucht habe, haben irgendwelche widersprüchlichen Formen oder Anti-Diebstahl-Token, und der Computerschlüssel unter allen Apps scheint richtig konfiguriert zu sein, sonst glaube ich nicht, dass die Authentifizierung überhaupt funktionieren würde. Ich überlege gerade, auf die Basis-Site umzuleiten und die Logout-Aktion von dort aus durchzuführen, aber wenn es noch eine einfachere Lösung gibt, auf die ich noch stoßen muss, wäre das nett.

+0

Bleiben Ihre Webanwendungen in einer Lösung oder haben Sie für jede Anwendung eine andere Lösung? –

+0

Ursprünglich sind sie in verschiedenen Lösungen, obwohl sie veröffentlicht wurden. – pjthomso

+0

Haben Sie versucht, sich mit unterschiedlichen Timings abzumelden?Ich meine abloggen von wo Sie wollen in dem Moment, als Sie gerade unterzeichneten und lassen Sie mich wissen, was passiert –

Antwort

0

Die AntiForgeryToken funktioniert durch Erstellen eines versteckten Feldes und ein Cookie mit dem gleichen Token (siehe this blod post). Da Ihr Formular an eine andere URL gesendet wird, denke ich, dass der Cookie entweder nicht mit dem POST übertragen wird oder Ihr Browser noch einen Cookie von einer früheren Anfrage an Ihre Basis-Site hat und daher einen falschen sendet. Tritt dieses Verhalten auch nach dem Löschen der Cookies auf (um sicherzustellen, dass keine alten Cookies verwendet werden)?

+0

Das Löschen der Cookies und der Versuch, sich abzumelden, ohne dass eine neue Seite geladen wird, gibt den Fehler "Der erforderliche Anti-Fälschungs-Cookie" __RequestVerificationToken "ist nicht vorhanden.". Wenn ich versuche, nach dem Löschen der Cookies zu einer anderen Seite zu navigieren, werde ich auf die Anmeldeseite geschickt. Durch das Löschen der Cookies werde ich im Wesentlichen ausgeloggt. – pjthomso

0

Was ich getan habe, um dieses Problem zu lösen, ist das Verschieben der LogOff-Aktion in eine benutzerdefinierte Controller-Klasse, von der alle meine Controller bereits geerbt haben.

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

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

Und dann änderten einfach mein Abmeldeformular den Abmeldevorgang von den Stromreglern zu rufen, anstatt die Sicherheitssteuerung in dem Basisstations-Einzelheiten enthalten:

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

Ich bin nicht sicher, ob es eine ist Weg, um meine ursprüngliche Version zu arbeiten oder nicht, so für jetzt denke ich, werde ich damit gehen.