0

我有一個ASP.NET MVC Web應用程序,需要檢查用戶是否是Azure Active Directory中特定組的成員。爲了實現這一點,我將使用Microsoft Graph API,所以我下載了他們的示例,試用了here,並且運行正常。AADSTS70001:此API版本不支持應用程序

我的下一步是使用我自己的AppId,AppSecret和RedirectUri來運行,這是我遇到麻煩的地方。在Azure中,我去了AAD的「應用程序註冊」並確保添加了該應用程序。我打開了應用程序並複製了AppId的「應用程序ID」,創建了一個密鑰並將其用作AppSecret。我檢查了所有權限並按下了「授予權限」,並將我的網址添加到回覆網址中。我還將Authority屬性從https://login.microsoftonline.com/common/v2.0更改爲https://login.windows.net/xxxxxx.onmicrosoft.com。 。

    AuthorizationCodeReceived = async (context) => 
        { 
         var code = context.Code; 
         string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value; 
         ConfidentialClientApplication cca = new ConfidentialClientApplication(
          appId, 
          redirectUri, 
          new ClientCredential(appSecret), 
          new SessionTokenCache(signedInUserID, context.OwinContext.Environment["System.Web.HttpContextBase"] as HttpContextBase)); 
         string[] scopes = graphScopes.Split(new char[] { ' ' }); 

         AuthenticationResult result = await cca.AcquireTokenByAuthorizationCodeAsync(scopes, code); 
        }, 
        AuthenticationFailed = (context) => 
        { 
         context.HandleResponse(); 
         context.Response.Redirect("/Error?message=" + context.Exception.Message); 
         return Task.FromResult(0); 
        } 

當我運行應用程序,並按下「登錄」我會正確地來登錄屏幕,但是當我嘗試登錄它會崩潰在下面的代碼運行AcquireTokenByAuthorizationCodeAsync時發生崩潰

該錯誤消息我在AuthenticationFailed得到如下:

AADSTS70001:應用程序XXXXXXXX-4f81-4508-8dcb-df5b94f2290f'不支持該API的版本。跟蹤ID:XXXXXXXX-d04c-4793-ad14-868810f00c00相關ID:XXXXXXXX-ab83-4805-baea-8f590991ec0c時間戳:2017年6月13日10:43:08Z

能有人向我解釋什麼錯誤信息手段?我應該嘗試不同的版本嗎?我曾嘗試使用Microsoft.Graph v1.3.0/Microsoft.Graph.Core v1.4.0和Microsoft.Graph v1.4.0/Microsoft.Graph.Core v1.5.0。

回答

2

您正在嘗試使用MSAL和v1端點。這從使用ConfidentialClientApplication明顯可見。您需要使用ADAL(Azure AD身份驗證庫)。 或在https://apps.dev.microsoft.com上註冊v2的應用程序。

您可以從的NuGet獲得ADAL:https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect

你OnAuthorizationCodeReceived需要看起來像這樣:

private async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedNotification context) 
    { 
     var code = context.Code; 

     ClientCredential credential = new ClientCredential(clientId, appKey); 
     string userObjectID = context.AuthenticationTicket.Identity.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value; 
     AuthenticationContext authContext = new AuthenticationContext(Authority, new NaiveSessionCache(userObjectID)); 

     // If you create the redirectUri this way, it will contain a trailing slash. 
     // Make sure you've registered the same exact Uri in the Azure Portal (including the slash). 
     Uri uri = new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)); 

     AuthenticationResult result = await authContext.AcquireTokenByAuthorizationCodeAsync(code, uri, credential, graphResourceId); 
    } 
https://www.nuget.org/packages/Microsoft.IdentityModel.Clients.ActiveDirectory/

可以使用這裏ADAL找到一個示例應用程序

相關問題