2017-02-04 4 views
0

私は、Microsoftの権限に対してOpenIdConnectAuthenticationを使用しようとしています。私は認証することができますが、アクセストークンを取得しようとすると、呼び出しが失敗し、私が再認証することができます。私は決して適切なトークンを引き出さないようです。アクセストークンを取得するコードは次のとおりです。ConfidentialClientApplication AcquireTokenSilentAsyncは常に失敗します

public async Task<string> GetUserAccessTokenAsync() 
{ 
    string signedInUserID = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value; 
    //string signedInUserID = User.Identity.GetUserId(); 
    tokenCache = new MSALSessionCache(
     signedInUserID, 
     HttpContext.Current.GetOwinContext().Environment["System.Web.HttpContextBase"] as HttpContextBase); 
    var cachedItems = tokenCache.ReadItems(appId); // see what's in the cache 

    ConfidentialClientApplication cca = new ConfidentialClientApplication(
     appId, 
     redirectUri, 
     new ClientCredential(appSecret), 
     tokenCache); 

    try 
    { 
     AuthenticationResult result = await cca.AcquireTokenSilentAsync(scopes.Split(new char[] { ' ' })); 
     return result.Token; 
    } 

    // Unable to retrieve the access token silently. 
    catch (MsalSilentTokenAcquisitionException) 
    { 
     HttpContext.Current.Request.GetOwinContext().Authentication.Challenge(
      new AuthenticationProperties() { RedirectUri = "/" }, 
      OpenIdConnectAuthenticationDefaults.AuthenticationType); 

     //throw new Exception("Resource.Error_AuthChallengeNeeded"); 
     return null; 
    } 
} 

私には何が欠けているのか分かりません。私は今まで私を導くためにMicrosoft Graph REST ASPNET Connectサンプルを使用しました。私の最終目標は、ユーザーを認証し、そのプロファイルとMS残りのAPIからいくつかの項目を使用することです。

答えて

0

これを追跡できました。 Asp.net Identity authとUseOpenIdConnectAuthenticationの両方を使用していたため、外部ログイン要求を手動でClaimsPrincipalに追加する必要がありました。

 public async Task<ActionResult> ExternalLoginCallback(string returnUrl) 
    { 
     var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); 
     if (loginInfo == null) 
     { 
      return RedirectToAction("Login"); 
     } 

     // Sign in the user with this external login provider if the user already has a login 
     var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false); 

     logger.Info(loginInfo.Email + " attempted an external login with a result of " + result.ToString()); 

     switch (result) 
     { 
      case SignInStatus.Success:     
       foreach (Claim c in loginInfo.ExternalIdentity.Claims) 
       { 
        SignInManager.AuthenticationManager.AuthenticationResponseGrant.Identity.AddClaim(new Claim(c.Type + "_external", c.Value)); 
       } 

       var user = UserManager.FindById(SignInManager.AuthenticationManager.AuthenticationResponseGrant.Identity.GetUserId()); 

       user.LastLogin = DateTime.Now.ToUniversalTime(); 
       await UserManager.UpdateAsync(user); 

       return RedirectToLocal(returnUrl); 
      case SignInStatus.LockedOut: 
       return View("Lockout"); 
      case SignInStatus.RequiresVerification: 
       return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false }); 
      case SignInStatus.Failure: 
      default: 
       // If the user does not have an account, then prompt the user to create an account 
       ViewBag.ReturnUrl = returnUrl; 
       ViewBag.LoginProvider = loginInfo.Login.LoginProvider; 
       return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email }); 
     } 
    } 

外部IDは、asp.netのIDと名前が一致する主張があるので、私は貝の名前を変更する必要がありました:のようなこれは私が私のExternalLoginCallback(文字列にreturnurlは)何を見て。次に、コード内の任意の場所で外部ID要求を探して調整します。

関連する問題