AADSTS50020:我们无法从此 api 版本为 Microsoft 帐户颁发令牌

Posted

技术标签:

【中文标题】AADSTS50020:我们无法从此 api 版本为 Microsoft 帐户颁发令牌【英文标题】:AADSTS50020: We are unable to issue tokens from this api version for a Microsoft account 【发布时间】:2017-09-05 08:39:54 【问题描述】:

我正在编写一个简单的 C# 移动应用程序,我已在 https://apps.dev.microsoft.com/ 注册以访问 live.com/outlook.com 邮箱(不是 Outlook 365 mbx)。我正在使用 ADAL 进行身份验证,使用客户端 ID 并从注册中重定向 URI。我不确定我是否应该从注册站点生成密码以及我应该如何使用生成的密码。我遇到的是,我得到了通常的身份验证提示,我提供了我的凭据,我看到一个带有我的数据(名字、姓氏等)的令牌被返回(RequestSecurityTokenResponse),这意味着身份验证过程是成功的,但是身份验证过程以错误“AADSTS50020:我们无法从该 API 版本为 Microsoft 帐户颁发令牌。请联系应用程序供应商,因为他们需要使用 2.0 版协议来支持此操作。

我不确定如何解释该错误:错误是说我没有使用协议的 v2.0 还是说我没有调用他们的身份验证端点的 v2.0。

我面临的困难是,Microsoft 已经多次更改协议和接口,并且混淆了 live.com/outlook.com 和 azure/office365,最终我不知道我应该提供什么访问 live.com/outlook.com 邮箱的权限 url 和资源 uri。

我注意到,除了身份验证 UI,我没有获得应该授权应用程序代表我执行操作的 UI。

以下是经过混淆的 smtp 地址的传出请求。

https://login.live.com/ppsecure/post.srf?wa=wsignin1.0&wtrealm=urn%3afederation%3aMicrosoftOnline&wctx=estsredirect%3d2%26estsrequest%3drQIIARWPsU7CQABAubaQghqRaIIbAy6aa3uFttwlDmog0gEGXSQu19JCY8thbcU4ObjLBzg5OpjoYAyf4MRiYtg00RhmTRzF5SVvey8zV5JQScISQqqeA2idRxIiRYoMS8cUQ8VANixj14HUxSp0DAuXKmXVsh0tzGWyaDi_ix-FndGH_zZprV09ATAG4AuACw5MuMXmVhx11X-w0Dt3plzSZx2vd8sXu1HUPyGyzOLIZ-xIYq7r2Y5ks0AOqOdLoUPbD3xq5gHrjfiihjVLN7QStPU2hmWDupAirQJtza5gRbeo5rZfeTAWwFRYEfnsQj5d-BQVnohiKsvlE4XErwBukrPk7aX3-7vD5eblwc_1y_d-4jkp980qik_7x11crwaBKesmrQ-qhhm2VKaE-2Fto7XXsNBZo9bZRAQNU2CUXo3DHvGcyCWDDmF0tkhUSSGMWX81&wfresh=0&id=&pcexp=false&username=xyz%40hotmail.com&popupui=1&contextid=70F2DEC5506FD639&bk=1491815919&uaid=480c9031b6394304bae56ce1da5a258f&pid=0

这是我使用的代码:

string authority = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize";

PlatformParameters authParms = new PlatformParameters(PromptBehavior.Always, null);

AuthenticationContext authContext = new AuthenticationContext(authority, TokenCache.DefaultShared);

AuthenticationResult result = await authContext.AcquireTokenAsync(
    "https://outlook.office.com/mail.read",
    clientId,
    new Uri(redirectUri),
    authParms);

【问题讨论】:

能否将您的请求中的scoperesponse_type 分享给Azure AD 进行身份验证? 我在请求中看不到任何此类属性。我在上面编辑了我的帖子,添加了令牌请求 url。 我刚刚注意到您正在使用 ADAL。如果我没记错的话,ADAL 不支持 Azure AD v2.0。我认为您需要使用 MSAL (github.com/AzureAD/microsoft-authentication-library-for-dotnet)。 live.com/outlook.com 是否利用 Azure? 我不确定我是否理解您的问题。你介意解释一下吗? 【参考方案1】:

这里有三件事:

    使用https://apps.dev.microsoft.com 网站创建的应用程序 针对 AAD v2.0 端点,而不是 v1.0 端点(这些是不同版本的协议)

    ADAL 不支持 V2.0 端点。它受 MSAL 支持。但是 MSAL 的开发正在进行中,所以我认为你还不能完全使用它(你应该可以在几周内使用它,即使那样我也不认为它会是 GA)

    V2.0 端点支持直接使用 MSA 帐户进行身份验证,因此支持 MSAL,而不是 ADAL。 ADAL 仅支持 ADFS 和 AAD

我了解到您希望使用 MSA 帐户(实时)进行身份验证,因此您需要使用 MSA。如果可以的话,我建议你稍等一下

注意: 这有点微妙,但您也可以拥有 AAD 来宾帐户,它们是 Azure Active Directory 中的 MSA 帐户(您创建一个具有现有电子邮件地址的用户,这可能是一个 MSA)。 V1.0 端点支持这一点,因此也支持 ADAL,但您必须在 AAD 租户中使用这些电子邮件地址创建用户,这可能不是您想要的。还有一些 MSA 不起作用的流程(例如,当用户进行身份验证以使用本身使用 Web 服务的 Web 服务时:代表流程),所以我不推荐此选项。

【讨论】:

使用 MSAL 代替 ADAL 对我来说效果很好。对于 android 原生应用 =)) 谢谢!

以上是关于AADSTS50020:我们无法从此 api 版本为 Microsoft 帐户颁发令牌的主要内容,如果未能解决你的问题,请参考以下文章

无法访问 Azure 上的 OpenId UserInfo 端点(AADSTS90010:JWT 令牌不能与 UserInfo 端点一起使用)

AADSTS70002:验证凭据时出错。 AADSTS50126:用户名或密码无效

Blazor WASM AzureAD IdentityServer 导致 AADSTS90023:公共客户端无法发送客户端密码

获取#error = unsupported_response_type&error_description = AADSTS70005:使用令牌请求

AADSTS50012:从测试应用程序移动到生产环境时提供了无效的客户端密码

登录 Azure Web 应用程序失败并显示“AADSTS50079:用户需要使用多重身份验证”