Azure active directory 如何从服务获取作用域列表,以便通过客户端身份验证请求进行指定

Azure active directory 如何从服务获取作用域列表,以便通过客户端身份验证请求进行指定,azure-active-directory,azure-ad-graph-api,Azure Active Directory,Azure Ad Graph Api,我有一个UWP应用程序,它使用WebAccountManager进行AAD身份验证。我还有一个服务,托管在Azure中,由UWP应用程序使用。该服务使用UWP应用程序发送的令牌代表令牌获取另一个令牌(我认为这就是它的名称),然后作为用户调用其他服务API(例如Microsoft Graph和Outlook REST API)。换句话说,UWP应用程序调用WebAuthenticationCoreManager.RequestTokenAsync来获取令牌,并将其发送到我的服务,例如,我的服务调用

我有一个UWP应用程序,它使用WebAccountManager进行AAD身份验证。我还有一个服务,托管在Azure中,由UWP应用程序使用。该服务使用UWP应用程序发送的令牌代表令牌获取另一个令牌(我认为这就是它的名称),然后作为用户调用其他服务API(例如Microsoft Graph和Outlook REST API)。换句话说,UWP应用程序调用WebAuthenticationCoreManager.RequestTokenAsync来获取令牌,并将其发送到我的服务,例如,我的服务调用AuthenticationContext.AcquireTokenAsync来获取在调用Outlook REST API时要使用的代表令牌

在“我的服务”的AAD注册中,“所需权限”列出了它可能代表用户进行的所有服务和权限/API调用(例如,“Microsoft Graph”->“完全访问用户日历”)


当我的UWP应用程序创建WebTokenRequest以传递到RequestTokenAsync函数时,它当前传递一个空字符串作为“scope”的值。它应该传递什么作为scope参数?它是否应该传递服务声明所需的完整且准确的权限列表?如果是这样,我如何向客户端获取该权限列表?只要硬编码并在服务所需权限列表发生更改时更新列表?

在Azure Active Directory中,有两种根本不同的方法来指定应用程序进行身份验证时所需的权限

  • 静态同意
  • 回到Azure Active Directory V1端点,在注册客户端应用程序时,您将为其他API设置“必需权限”。这是设置静态同意。这些权限是固定的,当您触发用户同意这些权限时,用户必须同时同意所有权限。此外,如果您的应用程序在某个时候希望向其他API添加新权限,则需要强制用户再次进行完全同意体验,这甚至可能需要应用程序上的特殊逻辑

    这就是为什么在V2端点中,Microsoft开发了增量和动态同意

    使用v2.0端点,您可以在运行时以及在正常使用应用程序期间动态指定应用程序所需的权限。为此,您可以通过在授权请求的scope参数中包含应用程序在任何给定时间点所需的作用域来指定它们

    在这里,您可以仅指定应用程序完成其当时尝试完成的流所需的权限。如果需要更多访问权限,只需在身份验证过程中添加,它将仅提示用户输入这些新权限

    现在让我们回到你的问题上来。如果您使用的是V2端点,那么应该使用动态许可,这意味着“必需权限”中的设置对您来说并不重要。您应该在应用程序设置中保留应用程序所需的作用域列表


    V2端点中的某些情况仍然需要静态同意,例如具有直接应用程序权限的服务对服务调用。对于这些情况,您将传递范围
    /。默认值
    ,如前所述。这可能也适用于委托令牌,但最好只使用动态同意。

    如何知道我正在使用的端点版本?根据您的回答,我怀疑我们使用的是1.0,因为我们使用的是静态同意。如果使用V1端点,我应该指定什么作为“scope”参数?注意:我还在这里询问了版本:它取决于获取访问令牌时调用的令牌端点<代码>https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token
    用于AAD v2。请注意url中的
    v2.0
    。否则
    https://login.microsoftonline.com/{tenant}/oauth2/token
    用于V1。注意,使用V1端点时没有
    范围
    参数。从对另一个问题的回答来看,WAM似乎使用V1端点。您说在使用v1端点时没有
    scope
    参数,但是
    WebTokenRequest
    的构造函数中显然有一个
    scope
    参数,它是。你是说它只是被忽略了,不管放在那里的是什么?你有没有想过放在什么范围内?