2017-09-27 12 views
0

Microsoft 계정으로 사용자를 인증 할 때 문제가 있습니다. OpenId 연결 인증을 사용하고 있지만 AcquireTokenByAuthorizationCodeAsync 메서드를 호출하면 다음 메시지가 표시됩니다.'AADSTS70000 : 전송 데이터 구문 분석기 오류 : 인증 코드 형식이 잘못되었거나 잘못되었습니다.

예외 발생 : System.Private.CoreLib.dll에서 'Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException': 'AADSTS70000 : 전송 데이터 파서 실패 : 인증 코드가 잘못되었거나 유효하지 않습니다.

정식 옵션은 다음과 같은 것들이다 :

services.AddAuthentication(options => 
     { 
      options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; 
      options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; 

     }).AddOpenIdConnect(openIdOptions => 
     { 
      openIdOptions.ResponseType = OpenIdConnectResponseType.CodeIdToken; 
      openIdOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; 
      openIdOptions.Authority = String.Format(CultureInfo.InvariantCulture, "https://login.microsoftonline.com/{0}{1}", "common", "/v2.0"); 
      openIdOptions.ClientId = Configuration["MicrosoftAuth:ClientId"]; 
      openIdOptions.ClientSecret = Configuration["MicrosoftAuth:ClientSecret"]; 
      openIdOptions.SaveTokens = true; 
      openIdOptions.TokenValidationParameters = new TokenValidationParameters{ 
       ValidateIssuer = false 
      }; 
      var scopes = Configuration["MicrosoftAuth:Scopes"].Split(' '); 
       foreach (string scope in scopes){ 
        openIdOptions.Scope.Add(scope); 
      } 
      openIdOptions.Events = new OpenIdConnectEvents{ 
       OnAuthorizationCodeReceived = async (context) => 
       { 
        var code = context.ProtocolMessage.Code; 
        var identifier = context.Principal.Claims.First(item => item.Type == ObjectIdentifierType).Value; 
        IMemoryCache memoryCache = context.HttpContext.RequestServices.GetRequiredService<IMemoryCache>(); 
        var result = await GetTokenByAuthorizationCodeAsync(identifier, code, memoryCache); 
        context.HandleCodeRedemption(result.AccessToken, result.IdToken); 
       }, 
      }; 
     }); 

그리고 이것은 내 GetTokenByAuthorizationCodeAsync (나는 그냥 일을 만들려고 노력, 그것은 꽤하지 알고)과 같은 모습입니다 :

public async Task<AuthenticationResult> GetTokenByAuthorizationCodeAsync(string userId, string code, IMemoryCache memoryCache) 
    { 
     TokenCache userTokenCache = new SessionTokenCache(userId, memoryCache).GetCacheInstance(); 
     try 
     { 
      AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/common/oauth2/v2.0/token/", userTokenCache); 
      ClientCredential credential = new ClientCredential(Configuration["MicrosoftAuth:ClientId"], Configuration["MicrosoftAuth:ClientSecret"]); 
      string[] scope = new List<String>().Append("https://graph.windows.net").ToArray(); 
      AuthenticationResult result = await authContext.AcquireTokenByAuthorizationCodeAsync(code,new Uri(Configuration["MicrosoftAuth:RedirectUri"]), credential, Configuration["MicrosoftAuth:ResourceId"]); 
      return result; 
     } 
     catch (Exception) 
     { 
      return null; 
     } 
    } 

나는이 오류의 원인이 무엇인지 전혀 모른다. 우편 발송자 요청을 보내면 인증 코드를 사용할 수 있지만 요청에 리소스 ID를 추가 할 수는 없습니다.

저는 Microsoft의 응용 프로그램 등록 포털 (https://apps.dev.microsoft.com/)에 응용 프로그램을 등록했습니다.

답변

1

액세스 토큰을 얻기 위해 Microsoft.IdentityModel.Clients.ActiveDirectory 라이브러리를 사용하고있었습니다. 이 라이브러리는 Azure AD v2.0 끝점 대신 Azure 포털에 등록하는 Azure AD 응용 프로그램에 사용됩니다.

Azure AD V2.0 응용 프로그램의 토큰을 얻으려면 MSAL 라이브러리를 사용할 수 있습니다. 참조 용 코드 샘플은 다음과 같습니다.

OnAuthorizationCodeReceived = async (context) => 
{ 
    var code = context.ProtocolMessage.Code; 
    ConfidentialClientApplication cca = 
     new ConfidentialClientApplication(Configuration["AzureAD:ClientId"], Configuration["AzureAd:PostLogoutRedirectUri"]+ "signin-oidc", new ClientCredential(Configuration["AzureAD:Secret"]), null, null); 
    var result =await cca.AcquireTokenByAuthorizationCodeAsync(code,new string[]{"user.read"}); 
    context.HandleCodeRedemption(result.AccessToken, result.IdToken); 
} 
+0

안녕하세요! 도와 줘서 고마워. MSAL 패키지를 설치했는데 지금 구매하면 스코프에 문제가 있습니다. 다음 메시지가 나타납니다. "AADSTS70000 : 요청한 하나 이상의 범위가 승인되지 않았거나 만료되어 요청이 거부되었습니다. 사용자가 먼저 로그인하여 요청 된 범위에 클라이언트 응용 프로그램 액세스 권한을 부여해야합니다." CCA에 정의 된 범위와 관련이 있다고 생각했지만 var 결과 행에 추가하면 동일한 문제가 발생합니다. 범위는 응용 프로그램 등록 포털에서 정의되었으므로 문제가 무엇인지 알 수는 없습니다 –

+0

Nevermind. 나는 그것을 가능하게 만들었다. 이제 OpenId Connect로 내 사용자를 인증 할 수 있습니다. 문제는 없습니다. 앱 포털에서 openid, profile 및 offline_access 범위를 추가해야했습니다. 이제 그래프 패키지와 함께 작동하는 데 문제가 있습니다. 다른 질문을하거나 자세한 내용을 여기에 제공해야합니까? –

+0

다른 질문에 대해서는 새로운 스레드를 다시 열어 커뮤니티가 문제를 더 쉽게 인식 할 수 있도록하는 것이 좋습니다. 그리고이 게시물이 orignal 문제에 도움이된다면 이것을 대답으로 받아 들일 수 있습니다. 그리고 같은 문제가있는 다른 커뮤니티에서는이 스레드에서 쉽게 문제를 찾을 수 있습니다. :) –