2017-05-04 6 views
0

OAuth로 ADFS 인증을 사용하여 webapp와 webapi간에 통신하려고합니다. 나는 ADFS4를 사용하고 있으며 이에 따라 서버 응용 프로그램과 Webapi로 응용 프로그램 그룹을 구성했습니다. userdetails, 특히 webapi 컨트롤러에서 사용자 이름을 받으려고합니다. webapi에 전달 된 액세스 토큰 내에서 사용자 이름 세부 정보를 전달할 수 있습니까? 여기에이 웹 애플리케이션 측에서 무슨 짓을 다음 Webapi 끝에서ADAP4-OAuth2의 WebAPI에서 사용자 이름을 얻을 수 없습니다. OpenID

authContext = new AuthenticationContext(Startup.authority, false); 
ClientCredential credential = new ClientCredential(Startup.clientId, Startup.appKey); 
string accessToken = null; 
bool isAuthenticated = User.Identity.IsAuthenticated; //return true 
string username = User.Identity.Name; // returns username 
string userId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Name).Value; // returns username 

HttpClient httpClient = new HttpClient(); 
try 
{ 
    result = authContext.AcquireTokenAsync(Startup.apiResourceId, credential).Result; 
    accessToken = result.AccessToken; 

} 
catch (AdalException ex) 
{ 
} 

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); 

HttpResponseMessage response = httpClient.GetAsync(Startup.apiResourceId + "/api/ConfApi").Result; 

, ADFS 인증 후 웹 애플리케이션 컨트롤러에서

, Startup.Auth.cs에, 나는이 코드

public void ConfigureAuth(IAppBuilder app) 
{ 
    JwtSecurityTokenHandler.InboundClaimTypeMap.Clear(); 
    app.UseActiveDirectoryFederationServicesBearerAuthentication(
     new ActiveDirectoryFederationServicesBearerAuthenticationOptions 
     { 
      MetadataEndpoint = ConfigurationManager.AppSettings["ida:AdfsMetadataEndpoint"], 
      TokenValidationParameters = new TokenValidationParameters() { 
       SaveSigninToken = true, 
       ValidAudience = ConfigurationManager.AppSettings["ida:Audience"] 
      } 
     }); 
    } 
를 추가 한

그러나 ConfApi 컨트롤러에서 사용자 세부 정보가있는 클레임을 찾을 수 없습니다.

Webapi 컨트롤러에서 사용자 세부 정보를 수신하려면 어떻게해야합니까?

도움 주셔서 감사합니다.

+0

가능한 복제본 [MSIS9649 : 잘못된 OAuth 요청을 받았습니다. 'assertion'매개 변수 값이 유효한 액세스 토큰이 아닙니다.] (https : // stackoverflow.com/questions/43867426/msis9649-received-invalid-oauth-request-the-assertion-parameter-value-is-not) –

답변

0

실제로 청구를하고 계십니까?

ADFS 측에서 웹 API에 대한 클레임 규칙을 구성 했습니까?

이름 - 표시 이름, 표시 이름 등은 무엇을 사용 했습니까?

트래픽을 모니터링하기 위해 피들러 (Fiddler)와 같은 것을 사용하십시오. OIDC 인증 후 액세스 토큰, ID 토큰 등을 볼 수 있습니다.

토큰을 가져 와서 jwt.io로 복사하십시오.

실제로받는 정보를 표시합니다.

그러나 OWIN 클래스는 간단한 OAuth 특성을 변환합니다. 청구 유형 URI에 'aud'를 입력합니다. http://claims/this-claim 그래서 브레이크 포인트를 찾아 클레임 컬렉션에있는 항목과 각 항목에 할당 된 유형을 확인하십시오.

0

이에 대한 대답은 같은 질문에 대답 : 당신은 (이 경우 웹 응용 프로그램) 서버 응용 프로그램을 얻기 위해 (대신 클라이언트 자격 증명 흐름을 부여의) 인증 코드 흐름을 사용해야 MSIS9649: Received invalid OAuth request. The 'assertion' parameter value is not a valid access token

사용자의 컨텍스트로 웹 API와 대화 할 수 있습니다. 인증 코드 흐름은 JWT 토큰의 클레임을 전달합니다. 웹 API의 RPT 클레임 발급 변환 규칙에서 웹 API에 필요한 모든 클레임을 전달해야합니다.

Vittorio has a nice post on authorization code flow, although it talks about azure.

인증 코드 흐름을 사용하려면 Startup.ConfigureAuth (IAppBuilder 응용 프로그램)에서 OpenIdConnectAuthenticationOptions에 공지를 통해 AuthorizationCodeReceived 이벤트를 처리 할 필요가

app.UseOpenIdConnectAuthentication(
    new OpenIdConnectAuthenticationOptions { 
     ... 
     Notifications = new OpenIdConnectAuthenticationNotifications { 
      AuthorizationCodeReceived = async code => { 
       ClientCredential credential = new ClientCredential(Startup.clientId, Startup.appKey); 
       AuthenticationContext authContext = new AuthenticationContext(Startup.authority, false); 
       AuthenticationResult result = await authContext.AcquireTokenByAuthorizationCodeAsync(
        code.Code, 
        new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), 
        credential, 
        Startup.apiResourceId); 
      } 
     } 

당신은 할 준비가되면 너는 너의 토큰을 조용히 얻는다.

var authContext = new AuthenticationContext(Startup.authority, false); 
var credential = new ClientCredential(Startup.clientId, Startup.appKey); 
var claim = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value; 
var userId = new UserIdentifier(claim, UserIdentifierType.UniqueId); 

result = await authContext.AcquireTokenSilentAsync(
    Startup.apiResourceId, 
    credential, 
    userId); 

HttpClient httpClient = new HttpClient(); 
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
    "Bearer", 
    result.AccessToken);