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找到一个示例应用程序

相关问题