2014-06-23 11 views
5

Ich versuche einen Benutzer über Facebook für meine Web-API zu authentifizieren. Ich bin in der Lage, den Benutzer zu authentifizieren, wenn ich den Returnurl-Parameter für die Basis der Website angeben.Asp.net Web API 2 Facebook Login

Meine Website-Layout ist die folgende in meiner Testumgebung:

http://subdomain.main.com/api/ - This is the api location

http://subdomain.main.com/web/ - This is the client website location

erhalte ich die Liste der Anbieter über die api und es gibt die folgende JSON

[{"Name":"Facebook","Url":"/api/api/Account/ExternalLogin? 
provider=Facebook&response_type=token& 
client_id=self&redirect_uri=https%3A%2F%2Fsubdomain.main.com%2F&state=mScYbSFDVHMMxVH8kaNWmDUNhqo2s4RFbG9SaBXt_jM1","State":"mScYbSFDVHMMxVH8kaNWmDUNhqo2s4RFbG9SaBXt_jM1"}] 

ich den Benutzer dann umleiten zu die URL, die von der API bereitgestellt wird. Dadurch wird Facebook geöffnet und der Benutzer wird aufgefordert, meine App zuzulassen.

So seine ganze Arbeit, wenn ich die Basis-URL verwenden, aber wenn ich die ReturnUrl wie folgt ändern:

https://subdomain.main.com/api/api/Account/ExternalLogins?returnUrl=https://subdomain.main.com/web/&generateState=true

Die api gibt eine URL als normal, aber wenn ich versuche, den Benutzer auf die umleiten url sofern sie nur zurück:

error: invalid_request

Wie kann ich die API erhalten auf meiner Website umgeleitet, so dass ich das OAuth-Token fangen kann?

Antwort

5

Sie müssen die ValidateClientRedirectUri-Methode bearbeiten, um Ihre benutzerdefinierte Rückgabe-URL einzuschließen. Der Standardvorlagencode erlaubt nur den Stamm Ihrer Website als gültige Rückgabe-URL.

Das folgende Beispiel ist ein schneller Hack, bis Sie sich für die genaue Rückkehr uri entscheiden.

public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context) 
    { 
     if (context.ClientId == _publicClientId) 
     { 
      Uri expectedRootUri = new Uri(context.Request.Uri, "/"); 

      if (expectedRootUri.AbsoluteUri == context.RedirectUri) 
      { 
       context.Validated(); 
      } 
     } 

     return Task.FromResult<object>(null); 
    } 

zu

public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context) 
    { 
     if (context.ClientId == _publicClientId) 
     { 
      context.Validated(); 
     } 

     return Task.FromResult<object>(null); 
    }