2014-06-23 29 views
5

Web api için Facebook üzerinden bir kullanıcının kimliğini doğrulamaya çalışıyorum. Web sitesinin tabanına returnurl parametresini belirttiğimde kullanıcıyı doğrulayabiliyorum.Asp.net Web api 2 Facebook kullanıcı girişi

Sitem düzeni benim test ortamında şudur:

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

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

Ben API yoluyla sağlayıcıların listesini almak ve o zaman kullanıcıyı yönlendirme

[{"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"}] 

aşağıdaki JSON döndürür API tarafından sağlanan url. Bu Facebook'u açar ve kullanıcının uygulamanıza izin vermesini ister.

Yani onun tüm ı taban url kullandığınızda çalışma, ama aşağıdaki returnurl değiştirdiğinizde:

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

api normal bir url döndürür, ancak ben kullanıcıyı yönlendirmek çalıştığınızda uRL sadece döner sağlanan:

error: invalid_request

nasıl oauth belirteci yakalamak böylece web siteme yönlendirmek için API alabilirim? Özel İade uri'nizi dahil etmek için ValidateClientRedirectUri yöntemini düzenlemeniz gerekir.

cevap

5

Varsayılan şablon kodu, yalnızca web sitenizin kökü geçerli bir getiri uri olarak izin verir.

Aşağıdaki örnek, tam dönüşü uri'ye karar verene kadar hızlı bir şekilde kesilir.

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

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

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