2017-12-22 47 views
1

질문 : 여기에 뭔가 빠져 있거나 실제로 어떤 함수를 호출해야하는지 오인하고 있습니까?Owin OAuth2.0 PasswordGrant flow

그래서 Owin.OAuth를 사용하여 OAuth2를 구현하는 테스트 WebApi 프로젝트를 작성하여 간단하게 시작했습니다. 시작 클래스 : 경로를 명중하고 공급자에 스테핑하는 것은 아무런 문제가 없지만, 여기에 코드입니다

public class OAuthProvider : OAuthAuthorizationServerProvider 
    { 

    public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     return base.ValidateClientAuthentication(context); 
    } 

    public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     return base.GrantResourceOwnerCredentials(context); 
    } 
} 

내가 사용 찾고 있어요 :

public void Configuration(IAppBuilder app) 
    { 
     var config = GlobalConfiguration.Configuration; 

     app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions 
     { 
      TokenEndpointPath = new PathString("/Token"), 
      Provider = new OAuthProvider(), 
      AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(60), 
      AllowInsecureHttp = true 
     }); 

     app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());   

     WebApiConfig.Register(config);    
    } 

그리고 지금 베어 제공자 클래스

비밀 번호 부여 https://tools.ietf.org/html/rfc6749#section-4.3.2. 토큰 엔드 포인트에 대한 요청이 "비밀"의 "grant_type"에 도착했을 때

가 호출 : 때 지금 OAuthAuthorizationServerProvider의 문서에 따라 GrantResourceOwnerCredentials 함수가 호출된다. 이것은 사용자가 클라이언트 응용 프로그램의 사용자 인터페이스에 직접 이름과 암호 자격 증명을 제공하고 클라이언트 응용 프로그램이 "access_token"및 선택적 "refresh_token"을 얻기 위해 이름과 암호 자격 증명을 제공 한 경우에 발생합니다.

그러나 나는 항상 ValidateClientAuthentication 기능으로가는 길을 쳤을 때.

이죠 페이로드 :

POST /Token HTTP/1.1 
Host: localhost:57507 
Content-Type: application/x-www-form-urlencoded 
Cache-Control: no-cache 
grant_type=password&username=test&password=test123 

는 또한 우체부를 통해 BasicAuth를 사용하여 시도는 :

POST /Token HTTP/1.1 
Host: localhost:57507 
Content-Type: application/x-www-form-urlencoded 
Authorization: Basic dGVzdDp0ZXN0MTIz 
grant_type=password 

내가 여기서 뭔가를 누락되거나 작동하는 방법을 잘못 해석하고 있는가?

답변

0

좋아요. 이렇게 물어 보았을 때 전화의 흐름을 잘못 해석했습니다.

비밀번호 권한을 사용할 때 첫 번째로 호출 할 함수가 GrantResourceOwnerCredentials 일 것이라고 생각했습니다. OAuth Spec Doc Password Grant. 실제로는 항상 ValidateClientAuthentication을 호출 할 때 GrantResourceOwnerCredentials을 호출합니다.

이것은 내 오해였습니다. 이 샘플 코드는 작동 중입니다.

0

기본 메서드를 호출하는 대신 GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext) 메서드의 본문에 자격 증명의 유효성을 검사하는 메서드를 "설명"해야합니다. context.Validated(ClaimsIdentity) 방법으로 전화하면 응답으로 무기명 토큰이 나옵니다.

이의 좋은 예와 의심의 여지가 - see first code block in question

또는 당신은 예를 볼 수 있습니다 here

ValidateClientAuthentication 당신의 자격 증명 "grant_type = 비밀번호 & 이름 = 시험 & 암호 = test123"

검증 그렇지 않으면 코드가 정상적으로 보입니다.

+0

네, 맞습니다. 이 샘플 프로젝트를 설정하여 프로젝트를 구현중인 프로젝트가 라우팅 문제를 일으키는 지 확인합니다. 그러나 나는 그것이 문서에서 어떻게 작동하는지 오해하고있었습니다. – BioSafety