C# 授权Azure REST API请求
我正在尝试编写一个本地控制台应用程序,它将使用交换Azure Web应用程序插槽。使用以下代码,我得到401(未经授权)响应:C# 授权Azure REST API请求,c#,rest,azure,azure-active-directory,azure-deployment-slots,C#,Rest,Azure,Azure Active Directory,Azure Deployment Slots,我正在尝试编写一个本地控制台应用程序,它将使用交换Azure Web应用程序插槽。使用以下代码,我得到401(未经授权)响应: public async Task Swap(string subscription, string resourceGroup, string site, string slot) { var client = new HttpClient(); var url = $"https://management.azure.com/su
public async Task Swap(string subscription, string resourceGroup, string site, string slot)
{
var client = new HttpClient();
var url =
$"https://management.azure.com/subscriptions/{subscription}/resourceGroups/{resourceGroup}/providers/Microsoft.Web/sites/{site}/applySlotConfig?api-version=2016-08-01";
var data = new {preserveVnet = true, targetSlot = slot};
var message = new HttpRequestMessage
{
RequestUri = new Uri(url),
Method = HttpMethod.Post,
Content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json")
};
var response = await client.SendAsync(message);
Console.WriteLine(response.StatusCode);
}
我知道我需要输入一些凭据,但我发现似乎适用于使用Azure AD进行身份验证的应用程序。这将是一个具有匿名身份验证的可公开访问的web应用。一般来说,您需要使用身份验证令牌将授权头附加到请求。有很多方法可以获得它,请参见此或。这就是我如何做到的(使用提供的链接):
请参阅以下内容以验证Azure资源管理器API身份验证:。
private async Task<string> GetAccessToken(string tenantName, string clientId, string clientSecret)
{
var authString = "https://login.microsoftonline.com/" + tenantName;
var resourceUrl = "https://management.azure.com/";
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;
}
public async Task Swap(string subscription, string resourceGroup, string site, string slot)
{
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", await GetAccessToken("XXX", "XXX", "XXX"));
var url =
$"https://management.azure.com/subscriptions/{subscription}/resourceGroups/{resourceGroup}/providers/Microsoft.Web/sites/{site}/applySlotConfig?api-version=2016-08-01";
var data = new {preserveVnet = true, targetSlot = slot};
var message = new HttpRequestMessage
{
RequestUri = new Uri(url),
Method = HttpMethod.Post,
Content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json")
};
var response = await client.SendAsync(message);
Console.WriteLine(response.StatusCode);
}