【发布时间】:2019-09-17 07:17:46
【问题描述】:
我必须通过 azure 功能按指定的时间表重新启动云服务实例。 为此,我使用 Azure 资源管理器 API。为此,我收到 403 错误。 1.我在Azure AD中创建了APP注册。 2.赋予它贡献者的角色。 3.在需要的地方使用了应用程序客户端ID、客户端密码、租户。 下面是代码:
private static async Task<string> GetAccessToken(string tenantName, string clientId, string clientSecret)
{
var authString = "https://login.microsoftonline.com/" + tenantName;
var resourceUrl = "https://management.core.windows.net/";
var authenticationContext = new AuthenticationContext(authString, false);
var clientCred = new ClientCredential(clientId, clientSecret);
var authenticationResult = await authenticationContext.AcquireTokenAsync(resourceUrl, clientCred);
var token = authenticationResult.AccessToken;
return token;
}
[FunctionName("RestartWorkerJob")]
public static void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, TraceWriter log)
{
var tenantName = "";
var clientId = "";
var clientSecret = "";
var token = GetAccessToken(tenantName, clientId, clientSecret).Result;
string url = "https://management.core.windows.net/{subscription_id}/services/hostedservices/testworkerrole/deployments/{deployment_name}/roleinstances/WorkerRole1_IN_0";
var client = new HttpClient();
var request = new HttpRequestMessage()
{
RequestUri = new Uri(url),
Method = HttpMethod.Post
};
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
client.DefaultRequestHeaders.Add("x-ms-version", DateTime.UtcNow.ToShortDateString());
client.DefaultRequestHeaders.Add(HttpRequestHeader.ContentLength.ToString(), "0");
try
{
var task = client.SendAsync(request).ContinueWith((taskwithmsg) =>
{
var response = taskwithmsg.Result;
var Text = response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
log.Trace(new TraceEvent(System.Diagnostics.TraceLevel.Info, "Restart was successful"));
}
else
{
log.Trace(new TraceEvent(System.Diagnostics.TraceLevel.Error, "Restart was unsuccessful"));
}
});
}
catch (Exception ex)
{
log.Trace(new TraceEvent(System.Diagnostics.TraceLevel.Error, ex.Message));
}}
使用这种方法会给我错误 403-forbidden。 服务器未能对请求进行身份验证。验证证书是否有效并且与此订阅相关联。
我不明白这里出了什么问题。
【问题讨论】:
-
这段代码在本地工作吗?您能否确认您获得的令牌是有效的,或者尝试在 curl 或 Postman 请求中自己使用它来验证令牌是否有效?
-
令牌似乎是有效的,因为它给了我 403 禁止,当令牌无效时它给 401 未经授权。这是我检查过的。
标签: azure azure-active-directory azure-functions