C# 如何正确地请求Azure承载令牌,或者为什么它要求我发送一个";范围“;参数 情况:

C# 如何正确地请求Azure承载令牌,或者为什么它要求我发送一个";范围“;参数 情况:,c#,azure-active-directory,azure-functions,bearer-token,C#,Azure Active Directory,Azure Functions,Bearer Token,我有一个WPF应用程序,它必须调用通过Azure Active Directory保护的http触发器函数。在尝试检索承载令牌以进行进一步呼叫时,我得到以下响应(无论我是通过邮递员还是代码执行此操作): AADSTS90014:缺少必需的字段“范围” 我所做的: 我阅读了大量不同的文章和博客文章,解释如何使用Azure AD保护http触发器功能,并通过rest请求检索承载令牌。根据其中一篇我认为最适合我需要的文章,我创建了azure function应用程序、azure function、az

我有一个WPF应用程序,它必须调用通过Azure Active Directory保护的http触发器函数。在尝试检索承载令牌以进行进一步呼叫时,我得到以下响应(无论我是通过邮递员还是代码执行此操作):

AADSTS90014:缺少必需的字段“范围”

我所做的: 我阅读了大量不同的文章和博客文章,解释如何使用Azure AD保护http触发器功能,并通过rest请求检索承载令牌。根据其中一篇我认为最适合我需要的文章,我创建了azure function应用程序、azure function、azure广告配置和应用程序注册的完整设置

在那之后,我只想通过发送承载令牌和一些其他参数来使用azure函数并获得结果,但我在检索承载令牌时遇到了困难

代码(以防万一):

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

授予\ u type=“客户\凭证”

客户端\u id={azure ad应用程序的应用程序id}

客户端_secret={generated secret}

ressource=“”

以及我用于获取令牌的Url:

{myTenant}/oauth2/v2.0/token

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

  • 为什么身份验证服务在我的情况下需要一个“scope”参数(我的设置或rest请求中是否有错误)
  • 在我必须发送范围值的情况下,要发送哪个范围值

  • 根据您提供的信息,我认为您希望使用来访问受Azure AD保护的功能。如果是这样,由于您使用Azure AD v2.0,您需要将资源更新到范围。作用域的值应该是``{app id URI}/.default。有关更多详细信息,请参阅。

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

  • 注册客户端以访问web api

    a。注册新的Azure广告应用程序

    b。配置权限

    c。创造一个新的秘密

    d。获取应用程序id url

  • 代码

  • var client=new RestClient(“https://login.microsoftonline.com//oauth2/v2.0/token");
    var请求=新的重新请求(Method.POST);
    request.AddHeader(“内容类型”、“应用程序/x-www-form-urlencoded”);
    AddParameter(“授权类型”、“客户端凭据”、ParameterType.GetOrPost);
    AddParameter(“客户端id”、“您的应用程序id”、ParameterType.GetOrPost);
    AddParameter(“客户端密码”、“你的应用程序密码”、ParameterType.GetOrPost);
    request.AddParameter(“scope”、“/.default”、ParameterType.GetOrPost);
    IRestResponse response=client.Execute(请求);
    
    结果:

    正如上面提到的azure AD v2的答案一样,您不会从资源中获得令牌,而是从范围中获得令牌。或者将您的权限更改为{myTenant}/oauth2/token,然后您可以使用v1端点,并可以根据您的资源获取令牌

    否则,您可以使用上述答案中提到的默认作用域,也可以转到azure门户并转到应用程序注册页面,导航到Expose a API部分,然后检查是否存在任何作用域。如果没有,您可以使用该作用域创建一个


    另外,请确保https://{somefunctionname}.azurewebsites.net是您的应用程序id URI

    愚蠢的观察-您是否拼错了ressource(带2 s)?在将其拼写为“s”时检索“resource”请求参数不受支持。非常感谢您的回答!将“ressource”参数更改为“scope”参数并给出“htttp://xyz.net/.default“url解决了我的问题。
    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);
    
     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);