C# 如何正确地请求Azure承载令牌,或者为什么它要求我发送一个";范围“;参数 情况:
我有一个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 我的问题: 因此,详细了解情况后,我有两个主要问题: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
根据您提供的信息,我认为您希望使用来访问受Azure AD保护的功能。如果是这样,由于您使用Azure AD v2.0,您需要将资源更新到范围。作用域的值应该是``{app id URI}/.default。有关更多详细信息,请参阅。 关于如何获取访问令牌,请参考以下步骤
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);