【发布时间】:2016-04-05 22:08:22
【问题描述】:
我正在使用 Azure REST API 来获取计费使用情况和费率卡详细信息。 要使用 AcquireToken() 方法获取 Token,最初我只使用 Client Id,然后在登录窗口中询问用户凭据。
但是,我正在寻找 非交互式方法,因此我使用了 Client Credentials,其中我传递了 Client Id 和 客户端密钥。
但它给出了“远程服务器返回错误 401 Unauthorized”
当我深入查看错误时,我发现它给出了错误“访问令牌来自错误的受众或资源”
请给我任何解决方案,让我无需任何用户交互即可访问 API。
提前致谢。
这是我的代码:
{
string token = GetOAuthTokenFromAAD();
string requestURL = String.Format("{0}/{1}/{2}/{3}",
ConfigurationManager.AppSettings["ARMBillingServiceURL"],
"subscriptions",
ConfigurationManager.AppSettings["SubscriptionID"],
"providers/Microsoft.Commerce/RateCard?api-version=2015-06-01-preview&$filter=OfferDurableId eq 'MS-AZR-*****' and Currency eq 'INR' and Locale eq 'en-IN' and RegionInfo eq 'IN'");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestURL);
request.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + token);
request.ContentType = "application/json";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Console.WriteLine(String.Format("RateCard service response status: {0}", response.StatusDescription));
}
public static string GetOAuthTokenFromAAD()
{
AuthenticationContext authenticationContext = new AuthenticationContext(string.Format("{0}/{1}",ConfigurationManager.AppSettings["ADALServiceURL"], ConfigurationManager.AppSettings["TenantDomain"]));
AuthenticationResult result = null;
ClientCredential uc = new ClientCredential(Client_Id, Secret_Key);
try
{
result = authenticationContext.AcquireToken("https://management.core.windows.net/", uc);
}
return result.AccessToken;
}
//App Config File
<add key="ADALServiceURL" value="https://login.microsoftonline.com" />
<add key="ADALRedirectURL" value="http://*****-authentication.cloudapp.net" />
<add key="ARMBillingServiceURL" value="https://management.core.windows.net" />
<add key="TenantDomain" value="********.onmicrosoft.com" />
<add key="SubscriptionID" value="*******-****-****-****-********" />
<add key="ClientId" value="*******-****-****-****-********" />
【问题讨论】:
-
请分享您的代码以及您在 Azure AD 中创建的应用程序的设置。
-
一个快速的问题 - 在 Azure AD 中配置应用程序时,您是否添加了执行服务管理 API 操作的权限?
-
是的。我已将 Windows Azure 服务管理权限提供为访问 Azure 服务管理(预览版),这是委派权限下下拉菜单中唯一可用的选项。
-
最后一个问题(很抱歉以零碎的方式提出这些问题)- 在 Azure AD 中创建应用程序时,您选择了 Web 应用程序。正确的?让我尝试在我的 Azure AD 中做同样的事情,看看我是否可以重现这种行为。
-
请参阅此链接:azure.microsoft.com/en-in/documentation/articles/…。您需要在订阅级别执行此操作。此外,由于您遇到了与“观众”相关的错误,因此在令牌中看到观众并没有什么坏处。在您的代码中执行以下操作:
System.IdentityModel.Tokens.JwtSecurityToken securityToken = new System.IdentityModel.Tokens.JwtSecurityToken(token);,然后检查 securityToken 中的Audiences属性。请看截图:i.stack.imgur.com/j4RWS.png
标签: c# azure azure-billing-api