如何正确请求 Azure 不记名令牌或为什么它要求我发送“范围”参数?

rek*_*cul 3 c# azure-active-directory bearer-token azure-functions

情况:

我有一个 WPF 应用程序,它必须调用通过 Azure Active Directory 保护的 http-trigger 函数。在尝试检索不记名令牌以进行进一步调用时,我得到以下响应(无论我是通过邮递员还是代码完成):

AADSTS90014:缺少必填字段“范围”

我所做的:

我阅读了大量不同的文章和博客文章,这些文章和博客文章解释了如何使用 Azure AD 保护 http 触发功能并通过休息请求检索不记名令牌。按照我认为最适合我的需求的一篇文章,我创建了 azure 函数应用程序、azure 函数、azure AD 配置和应用程序注册的完整设置。

之后,我只想通过发送不记名令牌和其他一些参数来使用 azure 函数并获得结果,但我在检索不记名令牌时遇到了麻烦。

代码(以防万一):

var restClient = new RestClient("https://login.microsoftonline.com/{myTenant}/oauth2/v2.0/token");
var restRequest = new RestRequest(Method.POST);
restRequest.AddHeader("content-type", "application/x-www-form-urlencoded");
restRequest.AddParameter("grant_type", "client_credentials", ParameterType.GetOrPost);
restRequest.AddParameter("client_id", "{app id from azure ad app}", ParameterType.GetOrPost);
restRequest.AddParameter("client_secret", "{generated secret}", ParameterType.GetOrPost);
restRequest.AddParameter("ressource", "https://{somefunctionname}.azurewebsites.net", ParameterType.GetOrPost);
var restResponse = restClient.Execute(restRequest);
Run Code Online (Sandbox Code Playgroud)

邮递员身体参数(x-www-form-urlencoded):

grant_type = "client_credentials"

client_id = {来自 azure 广告应用的应用 ID}

client_secret = {生成的秘密}

ressource = " https://somefunctionname.azurewebsites.net "

以及我用来获取令牌的网址:

https://login.microsoftonline.com/ {myTenant}/oauth2/v2.0/token

我的问题:

因此,详细了解情况后,我有两个主要问题:

  1. 为什么身份验证服务在我的情况下需要“范围”参数(我的设置或休息请求中是否有问题)?
  2. 如果我必须发送一个范围值,要发送哪个范围值?

Jim*_* Xu 11

根据你提供的信息,我认为你想使用Azure AD v2.0来访问受Azure AD保护的功能。如果是这样,由于您使用 Azure AD v2.0,您需要将资源更新为作用域。并且范围的值应该是```{app id URI}/.default。有关更多详细信息,请参阅OAuth 2.0 客户端凭据流程在此处输入图片说明

关于如何获取访问令牌,请参考以下步骤。

  1. 注册客户端访问web api

    一种。注册新的 Azure AD 应用程序

    在此处输入图片说明 在此处输入图片说明

    湾 配置权限 在此处输入图片说明

    C。创建一个新的秘密 在此处输入图片说明

    d. 获取应用 ID 网址 在此处输入图片说明

  2. 代码

 var client = new RestClient("https://login.microsoftonline.com/<your tenant>/oauth2/v2.0/token");
            var request = new RestRequest(Method.POST);
            request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
            request.AddParameter("grant_type", "client_credentials", ParameterType.GetOrPost);
            request.AddParameter("client_id", "your app id", ParameterType.GetOrPost);
            request.AddParameter("client_secret", "your app secret", ParameterType.GetOrPost);
            request.AddParameter("scope", "<your app id url>/.default", ParameterType.GetOrPost);
            IRestResponse response = client.Execute(request);
Run Code Online (Sandbox Code Playgroud)

结果: 在此处输入图片说明 在此处输入图片说明