2012-07-17 10 views
6

Ich verwende DotNetOpenAuth, um über OAuth2 eine Verbindung zu Facebook und Google herzustellen. Die OAuth-Spezifikationen verlangen, dass in request_uri keine zusätzlichen Parameter angegeben werden, und Google erzwingt dies tatsächlich dadurch, dass er gezwungen ist, ein genaues Callback-URI anzugeben, wenn Sie Ihre Google App mit ihnen definieren.DotNetOpenAuth OAuth2.0-Statusparameter

Ich möchte den Benutzer zu einer bestimmten URL zurückgeben, nachdem sie mit Facebook oder Google authentifiziert wurden. Der Fluss ist dies, der Benutzer klickt auf einen geschützten Link, sie werden mit einem ReturnUrl-Parameter auf meine Login-Seite weitergeleitet und dann starte ich den Autorisierungsprozess basierend auf dem OAuth2-Autorisierungsserver, den sie wählen.

Da die request_uri keine Parameter enthalten kann (obwohl Facebook Sie damit durchkommen lässt), kann ich den Parameter returnUrl nicht an den Autorisierungsserver senden und ihn zurückerhalten, so dass der Benutzer zurückkehrt Meine Site, ich leite sie an die geschützte Seite weiter, auf die sie zugreifen wollten. Das Beste, was ich tun kann, ist, sie an die Homepage oder eine Willkommensseite für Mitglieder weiterzuleiten.

Die Art und Weise, dies zu beheben, ist die Verwendung des Parameters "state", den der Autorisierungsserver an request_uri zurücksendet, aber ich finde keine Möglichkeit, dies mit DotNetOpenAuth anzugeben.

Standardmäßig sieht es so aus, als ob der Code die SessionID als Statusparameter verwendet, um zu überprüfen, ob die Anforderung vom Autorisierungsserver zurückkommt. Durch die Angabe eines IClientAuthorizationTrackers in der WebServerClient-Klasse kann ich meine Logik anschließen, wenn die Antwort vom Autorisierungsserver zurückkommt, aber nicht aufgerufen wird, wenn die Autorisierungsanforderung vorbereitet wird. Daher kann ich meinen zusätzlichen Status nicht einbinden.

Dies ist Code aus WebServerClient.cs des PrepareRequestUserAuthorization:

  // Mitigate XSRF attacks by including a state value that would be unpredictable between users, but 
     // verifiable for the same user/session. 
     // If the host is implementing the authorization tracker though, they're handling this protection themselves. 
     if (this.AuthorizationTracker == null) { 
      var context = this.Channel.GetHttpContext(); 
      if (context.Session != null) { 
       request.ClientState = context.Session.SessionID; 
      } else { 
       Logger.OAuth.WarnFormat("No request context discovered, so no client state parameter could be set to mitigate XSRF attacks."); 
      } 
     } 

Es gibt keinen anderen Block hier was, was ich erwartet hätte der Lage sein, zusammen zu spielen und in meiner eigenen Daten stecken.

Irgendwelche Tipps, was ich vermisse?

+0

Ich wollte sagen callback_uri im Gegensatz zu request_uri – Ameen

Antwort

0

Der Zustandsparameter ist notwendigerweise mit der Minderung von XSRF-Angriffen beschäftigt. Da Sie bereits eine Benutzersitzung haben, können Sie einfach die returnUrl im Sitzungswörterbuch speichern?

Alternativ können Sie file an issue mit DotNetOpenAuth fragen, dass Sie Ihre eigenen Daten in den Zustandsparameter (zusammen mit DNOA eigenen XSRF Mitigation Code) bündeln dürfen.

+1

Entschuldigung für das Ausgraben dieses alten Threads, aber wir brauchen die Fähigkeit, den Statuswert zu setzen, um die OAuth2-Reise zu verfolgen. Wenn in WebServerClient.cs AuthorizationTracker NICHT NULL ist, wird das xsrf-Token nicht hinzugefügt, aber es gibt kein "sonst", um es auf den Wert von AuthorizationTracker clientState zu setzen oder andernfalls einen vom Benutzer angegebenen Wert anstelle des xsrf-Tokens zuzulassen . Das klingt nach einem Versehen, es sei denn, es war eine bewusste Designentscheidung, die Sie näher ausführen könnten. – Lukos

+0

In meinem Fall kann ich den Nutzer nicht anhand verschiedener URLs unterscheiden. Ich muss verfolgen, welche Art von Anmeldung sie durchführen, damit sie nach dem Abschluss von OAuth2 auf eine andere Zielseite gelangen. Ich denke, dass dies der einzige Weg ist, dies zu erreichen, ohne den Anmeldeweg zu ändern, um sich zu einem späteren Zeitpunkt zu teilen (was ich gerne vermeiden würde). – Lukos