2017-03-31 7 views
0

서버가 인증/권한 부여에 Identity를 사용하는 .net 핵심 API이고 JWT 토큰을 생성하는 데 SimpleTokenProvider입니다. 특정 엔드 포인트에는 역할 권한 부여가 필요합니다.Access Token을 직접받지 못한 경우 .Net HttpClient가 사용 권한을 얻지 못함

[Authorize(Roles = "Admin")] 

내가 다른 컨트롤러 액션 메소드에서 토큰을 얻을, 세션에 토큰을 저장하고 API를 호출하는 토큰을 사용하려고 할 때, 또는 내가 하드 코드 우체부에서받은 토큰을하고 통과 API에서 사용자는 서버에서 인증되지만 인증에 실패합니다.

사용자가 권한을 얻는 유일한 방법은 동일한 컨트롤러 작업 방법으로 토큰을 요청하는 것입니다. 우체부에서 잘 작동합니다.

클라이언트 코드는 다음과 같습니다 :

서버 로그에서
string token = "ew0KICAiYWxnIjogIkhTMjU2IiwNCiAg..."; 

    HttpClient client = new HttpClient(handler); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));  
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); 
    HttpResponseMessage httpResponse = client.GetAsync("http://localhost:5001/api/dashboard").Result; 
      if (httpResponse.IsSuccessStatusCode) 
      { 
      Console.Write(httpResponse.Content.ReadAsStringAsync().Result); 
      } 

, 같은 엔드 포인트에 대한 권한이 호출은 다음과 같습니다

Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 GET http://localhost:5001/api/dashboard  
Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware:Information: HttpContext.User merged via AutomaticAuthentication from authenticationScheme: Identity.Application. 
    Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware:Information: Successfully validated the token. 
    Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware:Information: HttpContext.User merged via AutomaticAuthentication from authenticationScheme: Bearer. 
    Microsoft.AspNetCore.Authorization.DefaultAuthorizationService:Information: Authorization was successful for user: xxxxx. 
    Microsoft.AspNetCore.Authorization.DefaultAuthorizationService:Information: Authorization was successful for user: xxxxx. 

무단 호출하는 동안 다음과 같은 기록이있다 :

Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 GET http://localhost:5001/api/dashboard 
Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware:Information: Successfully validated the token. 
Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware:Information: HttpContext.User merged via AutomaticAuthentication from authenticationScheme: Bearer. 
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService:Information: Authorization was successful for user: xxxxx. 
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService:Information: Authorization failed for user: xxxxx. 
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'. 
Microsoft.AspNetCore.Mvc.ChallengeResult:Information: Executing ChallengeResult with authentication schemes(). 
Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware:Information: AuthenticationScheme: Bearer was forbidden. 
Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware:Information: AuthenticationScheme: Identity.Application was challenged. 

HttpCl에 어떤 옵션을 추가해야하는지 모르겠습니다. 권한 부여가 작동하려면.

답변

0

wireshark를 사용하여 HttpClient와 Postman의 요청 차이를 추적 한 후 .Net Identity는 요청한 메일의 일부로 보내야하는 .AspNetCore.Identity.Application이라는 쿠키를 설정한다는 것을 발견했습니다. 일할 수있는 권한.

쿠키를 가져 와서 후속 요청의 일부로 설정 한 후 제대로 작동합니다.

Wireshark screenshot