Azure AAD:你如何发送一个;“交互式授权请求”;在使用MSAL时解析AADSTS65001,如果它';不是通过打电话吗?

Azure AAD:你如何发送一个;“交互式授权请求”;在使用MSAL时解析AADSTS65001,如果它';不是通过打电话吗?,azure,azure-active-directory,msal,Azure,Azure Active Directory,Msal,我有一个用TypeScript编写的单页应用程序。它需要调用中间层服务,而中间层服务将依次调用MicrosoftGraphAPI 在我的SPA中,我使用,并通过调用UserAgentApplication.LoginDirect()让用户登录 然后我调用acquireTokenPopup并只传递access token请求参数中的一个作用域:由中间层服务定义的作用域。执行此操作时,我看到弹出窗口,但随后它消失了(我从未看到任何同意提示)。这将成功获取一个令牌,然后SPA将该令牌作为HTTPS请求

我有一个用TypeScript编写的单页应用程序。它需要调用中间层服务,而中间层服务将依次调用MicrosoftGraphAPI

在我的SPA中,我使用,并通过调用UserAgentApplication.LoginDirect()让用户登录

然后我调用acquireTokenPopup并只传递access token请求参数中的一个作用域:由中间层服务定义的作用域。执行此操作时,我看到弹出窗口,但随后它消失了(我从未看到任何同意提示)。这将成功获取一个令牌,然后SPA将该令牌作为HTTPS请求中授权头上的承载令牌发送到中间层

然后,中间层通过调用具有以下属性的AAD来尝试获取OBO令牌:

const grantType = "urn:ietf:params:oauth:grant-type:jwt-bearer";
const assertion = userAccessToken;
const scope = "https://graph.microsoft.com/Calendars.Read " +
    "https://graph.microsoft.com/Calendars.Read.Shared " +
    "https://graph.microsoft.com/Calendars.ReadWrite " +
    "https://graph.microsoft.com/Calendars.ReadWrite.Shared " +
    "openid profile email offline_access";
const requestedTokenUse = "on_behalf_of";
它还附带了一个客户端密码,该密码在中间层的AAD注册中定义。当向AAD端点发出此请求以检索OBO令牌时,它总是失败,并出现以下错误:

{"error":"invalid_grant","error_description":"AADSTS65001: The user or administrator has not consented to use the application with ID '<ID of middle-tier application>' named '<name of middle-tier application>'. Send an interactive authorization request for this user and resource.\r\nTrace ID: 39d9bace-03f0-402b-9310-c713aa990200\r\nCorrelation ID: edfbb88f-5c63-4cef-84c1-0de8457852b7\r\nTimestamp: 2019-05-22 22:25:24Z","error_codes":[65001],"timestamp":"2019-05-22 22:25:24Z","trace_id":"39d9bace-03f0-402b-9310-c713aa990200","correlation_id":"edfbb88f-5c63-4cef-84c1-0de8457852b7","suberror":"consent_required"}
{“错误”:“无效的授权”,“错误描述”:AADSTS65001:用户或管理员未同意使用ID为“”的名为“”的应用程序。请为此用户和资源发送交互式授权请求。\r\n空间ID:39d9bace-03f0-402b-9310-c713aa990200\r\n相关ID:edfbb88f-5c63-4cef-84c1-0de8457852b7\r\n时间戳:2019-05-22:25:24Z,“错误代码”:[65001],“时间戳”:2019-05-22 22:25:24Z,“跟踪id”:“39d9bace-03f0-402b-9310-c713aa990200”,“相关性id”:“edfbb88f-5c63-4cef-84c1-0de8457852b7”,“子错误”:“需要同意”}
我看到了需要同意的部分,以及我应该如何发送交互授权请求——但我不确定如何发送。事实上,当我最初调用acquireTokenPopup(而不是acquireTokenSilent)时,我以为我正在这样做

如果使用中间层定义的作用域在SPA客户端中调用acquireTokenPopup不是发送交互授权请求的正确方式,那么什么是

可能有用的信息:

  • 我的SPA客户端应用程序的ID列在中间层AAD注册门户的“授权客户端应用程序”部分和清单的“knownClientApplications”部分

谢谢!

首先,您在所描述的场景中使用的代表流看起来不错

对于管理员同意部分(要通过AADSTS65001错误),您可以尝试通过以下两种方式之一明确进行同意:

  • 使用Azure门户(适用于单租户应用程序)

    转到Azure门户>Azure广告>应用注册>应用注册>API权限,然后单击“授予[你的广告]管理员许可”按钮

  • 使用管理员同意端点(适用于单租户或多租户应用程序)

    有关Microsoft文档的详细信息,请单击此处-

    这里唯一的强制参数是
    客户端id
    。您可以跳过提供其他参数,并且同意仍然有效


另一方面,您提到的
knownClientApplications
部分有助于实现更高级的场景,即您尝试在一次交互中为多个应用程序加入许可。就像同一逻辑应用程序的多个层。如果您正试图实现这一点,那么您就不需要真正使用nt单独用于中间层API。在这种情况下,您仍然可以使用方法2作为管理员同意端点。

谢谢。我没有perms为我的租户的用户提供管理员同意,但我让组织来做了。FWIW,似乎关于发送交互请求的错误消息在这里具有误导性,因为事实证明我的租户配置为不允许用户同意(只有管理员可以这样做)因此,再多的交互请求也无法解决此问题。您还可以在客户端应用程序上使用作用域
.default
,这是每个应用程序的内置作用域,引用在应用程序注册上配置的静态权限列表。它将结合web api+客户端应用程序和预处理应用程序上的所有权限发送给用户。但是,要显示同意屏幕,您需要从
knownClientApplications
GET https://login.microsoftonline.com/{tenant}/adminconsent?
client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&state=12345
&redirect_uri=http://localhost/myapp/permissions