首页 文章

如何让AuthenticationContext使用v2.0 endpoints ?

提问于
浏览
0

我正在根据https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-multitenant-openidconnect上的入门示例代码处理一些代码 .

我在https://apps.dev.microsoft.com/注册了应用程序,这意味着我需要使用oauth v2.0 endpoints .

我已经更改了初始登录请求以使用有效的/oauth2/v2.0/authorize endpoints ,并在我的控制器中触发ProcessCode方法 . 我得到了代码,id_token和状态 .

然后在ProcessCode控制器操作中,我调用AuthenticationContext.AcquireTokenByAuthorizationCodeAsync方法 . 这将是/ common / oauth2 / token并返回“error”:“invalid_grant”,“error_description”:“AADSTS70000:身份验证失败:授权代码格式错误或无效 . ”

我猜这是因为代码是由v2.0 endpoints 发出的,而获取令牌请求需要转到/common/oauth2/v2.0/token endpoints ?

所以问题是如何让AuthenticationContext使用v2.0 endpoints ?这让我疯了好几天了 .

BTW使用Microsoft.IdentityModel.Clients.ActiveDirectory版本3.10.305231913

谢谢

多纳尔

1 回答

  • 1

    使用Microsoft身份验证库,该库是为与v2.0 endpoints 一起使用而构建的 . 你可以在这里找到它:https://www.nuget.org/packages/Microsoft.Identity.Client

    在此库中,AuthenticationContext已替换为ConfidentialClientApplication和PublicClientApplication . 在您的情况下,由于您在Web服务器(即机密客户端)中获取令牌,因此您需要执行以下操作:

    scopes = new string[] { "https://outlook.office.com/mail.read" }
    
    var ctx = new ConfidentialClientApplication(clientId, redirectUri, clientCredential, tokenCache);
    var t = await ctx.AcquireTokenByAuthorizationCodeAsync(scopes, authorizationCode);
    

    将范围替换为您希望使用访问令牌访问的任何内容 . 请记住,虽然v2.0 endpoints 中只有一组有限的范围(来自Outlook API和MS Graph的邮件,日历和联系人) .

    EDIT MS Graph中的所有范围现在都在v2 endpoints 中可用 .

相关问题