2017-09-27 5 views
0

Microsoftアカウントでユーザーを認証する際に問題が発生しています。 OpenId Connect認証を使用していますが、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:要求された1つ以上のスコープが不正または期限切れであるため、要求が拒否されました。ユーザーは最初にサインインし、クライアントアプリケーションに要求されたスコープにアクセスする必要があります。 私はCCAで定義されたスコープと関係があると思っていましたが、それらをvarの結果行に追加すると同じ問題が発生します。スコープはアプリケーション登録ポータルで定義されているので、問題が何であるかはわかりません。 –

+0

Nevermind。私はそれを機能させることができた。 OpenId Connectでユーザーを認証できるようになりました。問題はありません。アプリケーションポータルでopenid、profile、offline_accessのスコープを追加しなければなりませんでした。今私はそれがグラフパッケージで動作するように問題があります。私は別の質問をするか、ここで詳細を述べるべきですか? –

+0

異なる質問については、コミュニティが問題をより簡単に認識できるように新しいスレッドを再度開くことをお勧めします。そして、この投稿が口頭での問題に役立つなら、これを答えとして受け入れることができます。同じ問題を抱えている他のコミュニティは、このスレッドから簡単にヘルプを得ることができます:) –

関連する問題