2014-06-23 4 views
5

내 웹 API 용 Facebook을 통해 사용자를 인증하려고합니다. 웹 사이트의베이스에 returnurl 매개 변수를 지정할 때 사용자를 인증 할 수 있습니다.Asp.net Web api 2 Facebook 로그인

내 사이트 레이아웃은 내 테스트 환경에서 다음과 같다 :

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

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

나는 API를 통해 제공 업체의 목록을 가져 그리고 내가 다음에 사용자를 리디렉션

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

다음 JSON을 반환 API가 제공 한 URL Facebook을 열고 사용자에게 내 앱을 허용할지 묻습니다.

그래서 그 모든 내가 기본 URL을 사용하면 작업,하지만 난 다음에 returnurl을 변경할 때 :

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

API는 정상으로 URL을 반환하지만 난에 사용자를 리디렉션 할 때 url은 단지 다음을 반환합니다 :

error: invalid_request

oauth 토큰을 수신 할 수 있도록 API를 내 웹 사이트로 리디렉션 할 수 있습니까?

답변

5

사용자 지정 반환 URI를 포함하려면 ValidateClientRedirectUri 메서드를 편집해야합니다. 기본 템플릿 코드는 웹 사이트의 루트가 유효한 반환 URI 만 허용합니다.

정확한 답례 uri를 결정할 때까지 아래 예는 빠른 해킹입니다.

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

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

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