2014-06-23 30 views
5

Sto provando ad autenticare un utente tramite Facebook per il mio web api. Sono in grado di autenticare l'utente quando specifico il parametro returnurl nella base del sito web.Asp.net Web api 2 Login Facebook

mio layout del sito è la seguente nel mio ambiente di test:

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

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

ho l'elenco dei fornitori tramite l'API e restituisce il seguente 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"}] 

ho quindi reindirizzare l'utente a l'URL fornito dall'API. Questo apre Facebook e chiede all'utente di consentire la mia app.

Quindi è tutto il funzionamento quando uso l'URL di base, ma quando cambio la ReturnURL al seguente:

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

L'API restituisce un URL come normale, ma quando provo a reindirizzare l'utente al URL fornito restituisce solo:

error: invalid_request

Come posso ottenere l'API per reindirizzare il mio sito web in modo che possa prendere il token OAuth?

risposta

5

È necessario modificare il metodo ValidateClientRedirectUri per includere il ritorno personalizzato uri. Il codice del modello predefinito consente solo la radice del tuo sito web come uri di ritorno valido.

L'esempio di seguito è un attacco rapido fino a quando non si decide il ritorno esatto uri.

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); 
    } 

a

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

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