2014-06-23 33 views
5

Próbuję uwierzytelnić użytkownika za pośrednictwem Facebooka dla mojego interfejsu webowego. Jestem w stanie uwierzytelnić użytkownika po określeniu parametru returnurl na podstawie witryny internetowej.Asp.net Web api 2 Facebook login

Mój układ witryny jest następujący w moim środowisku testowym:

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

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

uzyskać listę dostawców za pośrednictwem interfejsu API i zwraca następujące 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"}] 

I potem przekierować użytkownika do URL podany przez API. To otwiera Facebooka i prosi użytkownika o zezwolenie na moją aplikację.

więc jej wszystko działa, gdy używam podstawowego adresu URL, ale kiedy zmienić ReturnURL do poniższego:

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

API zwraca adres URL jako normalne, ale gdy próbuję przekierować użytkownika do URL pod warunkiem, że po prostu wraca:

error: invalid_request

W jaki sposób mogę przekonać API do przekierowania na moją stronę internetową, aby można było złapać tokena Oautha?

Odpowiedz

5

Należy zmodyfikować metodę ValidateClientRedirectUri w celu uwzględnienia niestandardowego zwrotu URI. Domyślny kod szablonu zezwala tylko na katalog główny witryny jako prawidłowy zwrot uri.

Poniższy przykład to szybki hack, dopóki nie zdecydujesz o dokładnym powrocie 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); 
    } 

do

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

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