2017-11-11 16 views
0

MSAL을 사용하여 웹 API 앱에 액세스하는 데 사용되는 ID 토큰을 가져 왔습니다. 몇 가지 질문이 있는데 누군가가 내가 무슨 일이 일어나는지 이해할 수 있는지 궁금합니다. MSAL 및 Azure AD : 사용자 ID를 얻고 싶을 때 어떤 범위를 통과해야합니까?

나 클라이언트 측의 인증 프로세스를 시작하자. 이 경우 현재 사용자를 인증하기 위해 다음 코드를 사용하는 Windows Forms 앱을 구축하고 있습니다 (즉, 웹에 액세스하려고 할 때 사용자를 확인하는 데 사용되는 ID 토큰을 얻으려면) API 앱) :

//constructor code 
_clientApp = new PublicClientApplication(ClientId, 
        Authority, //which url here? 
        TokenCacheHelper.GetUserCache()); 
_scopes = new []{ "user.read" }; //what to put here? 

//inside a helper method 
try { 
     return await _clientApp.AcquireTokenSilentAsync(_scopes, _clientApp.Users.FirstOrDefault()); 
} 
catch (MsalUiRequiredException ex) { 
    try { 
      return await _clientApp.AcquireTokenAsync(_scopes); 
     } 
     catch (MsalException ex) { 
      return null; 
     } 
} 

가장 먼저 분명히하고 싶은 것은 authority 매개 변수에 사용해야하는 값입니다. 이 경우, 내가 양식에 URL을 사용하고 있습니다 : 그러나

https://login.microsoftonline.com/{Tenant}/oauth2/v2.0/token 

, 나는이 같은 멀리 얻을 수있는 인상을 해요 :

https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration

이 하나의 종단점이 내 Azure 광고에만 해당하는 것처럼 보이지만 다른 URL은 일반 URL처럼 보이는 것 같습니다 ... 어디서이 종단점에 대한 자세한 정보를 찾을 수 있으며 각각의 목적은 무엇입니까?

또 다른 것 내가 이해할 수없는 부분이 범위입니다. 나는 MS Graph (또는 다른 Azure 관련 서비스에 관해서는 그 문제에 대해)에 관심이 없다. 이전 버전의 MSAL 라이브러리에서는 기본 범위 중 하나를 참조 할 수있었습니다. 그러나, 그것은 더 이상 가능하지 않습니다 (적어도, 나는 시도하고 기본 범위를 통과해서는 안된다는 예외가 ...).

빈 모음 (예 : new List<string>()) 또는 null을 전달하면 오류가 발생합니다. 그래서,이 경우에는 user.read 범위를 통과하지 못했습니다 (내가 실수하지 않으면 MS Graph API에서 사용됩니다.) 이것은 분명히 필요하지는 않지만 인증을 관리하는 유일한 방법이었습니다 ID 토큰을 가져와야 할 때 호출을 수행하는 방법에 대한 단서가 있습니까? 다른 메서드를 호출해야합니까?

서버 측으로 이동하면 액세스 권한이있는 웹 API 응용 프로그램이 있습니다. .이 sample에 따르면,이 같은 사용해야하는 인증 헤더 (무기명)에서 ID 토큰을 통과 통화 제한 :

private void ConfigureAuth(IAppBuilder app) { 
    var authority = "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration"; 
    app.UseOAuthBearerAuthentication(
     new OAuthBearerAuthenticationOptions { 
      AccessTokenFormat = new JwtFormat(GetTokenValidationParameters(), 
        new OpenIdConnectCachingSecurityTokenProvider(authority)), 
              Provider = new OAuthBearerAuthenticationProvider { 
                OnValidateIdentity = ValidateIdentity 
              } 
              }); 
} 

자,이가하는 일을하고는 모든 요청에 ​​대해 401를 반환하는 돈 버지니아가 있어요. 뚜껑 ID 토큰. 그러나 한 가지 질문이 있습니다. 사용자 이름 (컨트롤러의 User.Identity.Name)을 식별하는 데 사용해야하는 티켓 ID에서 클레임을 지정하는 방법이 있습니까? 당신이 볼 수 있듯이

private Task ValidateIdentity(OAuthValidateIdentityContext arg) { 
    //username not getting correctly filled 
    //so, i'm handling this event in order to set it up 
    //from the preferred_username claim 
    if (!arg.HasError && arg.IsValidated) { 
     var identity = arg.Ticket.Identity; 
     var username = identity.Claims.FirstOrDefault(c => c.Type == "preferred_username")?.Value ?? ""; 
     if (!string.IsNullOrEmpty(username)) { 
      identity.AddClaim(new Claim(ClaimTypes.Name, username)); 
     } 
    } 
    return Task.CompletedTask; 
} 

, 나는 ID 토큰에서 preferred_username 주장 찾고 있어요이었다 (이 경우, I는 다음과 같습니다 코드로 그렇게하기 위해 OnValidateIdentity 처리 종료했습니다 그 값을 사용하여 이름 클레임을 설정합니다. 이 작업을 자동으로 수행 할 수있는 옵션이 있습니까? OAuthBearerAuthenticationMiddleware의 구성에서 뭔가가 누락 되었습니까? 당신의 먼저 쿼리에 대해서는

답변

0

- 은 어디에서이 엔드 포인트에 대한 각각의 목적을 무엇에 대한 자세한 정보를 찾을 수 있습니다 ...

대답 - https://login.microsoftonline.com/{세입자} /v2.0/.well-known/openid-configuration

{세입자} 취할 수있는 네 개의 값 중 하나를

  1. 공용 - 개인 Microsoft 계정과 직장 또는 학교 계정을 모두 갖고있는 사용자 f rom Azure Active Directory (Azure AD)는 응용 프로그램에 로그인 할 수 있습니다.

  2. 조직 - 푸른 광고에서 직장 또는 학교 계정을 가진 사용자 만 응용 프로그램에 로그인 할 수 있습니다.

  3. 소비자- 개인 Microsoft 계정을 가진 사용자 만 응용 프로그램에 로그인 할 수 있습니다.

  4. 8eaef023-2b34-4da1-9baa-8bc8c9d6a490 또는 contoso.onmicrosoft.com - 특정 푸른 AD 테넌트에서 직장 또는 학교 계정으로 사용자 만 응용 프로그램에 로그인 할 수 있습니다. Azure AD 테넌트의 친숙한 도메인 이름이나 세입자의 GUID 식별자를 사용할 수 있습니다. 당신의 둘째 쿼리 의 범위에 관한

-

대답 -이 문서를 참조하십시오 - 당신의 셋째 쿼리 에 대한 청구에 관한 OpenID Connect scopes

-

응답 -이 GIT 허브 샘플을 참조하십시오 - active-directory-dotnet-webapp-roleclaims

+0

안녕하세요 Mohit. 1 도움. 2, 정말로. 예를 들어, 일부 범위는 기본적으로 전송되며 내가 말한 것처럼 범위 컬렉션에서 다시 사용할 수는 없습니다. 3에 대해서는 답변을 찾았습니다. https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/f10a045459e7cb07548806561a47ecdb3471f5f6/src/Microsoft.IdentityModel.Tokens/TokenValidationParameters.cs#L413 –