Punya masalah dengan Azure Auth. Mendapatkan 401 Tidak Sah saat memanggil WebAPI yang Dihosting di Azure.
Berikut dasar-dasarnya: Ikuti tutorial ini - https://azure.microsoft.com/en-us/documentation/samples/active-directory-dotnet-daemon/
Terdaftar 2 Aplikasi:
- Layanan Windows
- API Web
Layanan Windows memanggil STS dan Berhasil mendapatkan JWT. Kemudian mencoba meneruskan token tersebut ke WebAPI yang dihosting di azurewebsites.net.
Ini kode saya untuk memanggil STS (Baru saja dibungkus dengan Kelas Auth):
public class AzureAuth
{
private AuthenticationContext authContext;
private ClientCredential clientCredential;
protected string AzureADInstanceName;
protected string AzureADTenancyName;
protected string AzureADApplicationClientId;
protected string AzureADApplicationSecret;
protected string AzureADApplicationAppId;
public AzureAuth(string azureADInstanceName, string azureADTenancyName, string azureADApplicationClientId, string azureADApplicationSecret, string azureADApplicationAppId)
{
this.AzureADInstanceName = azureADInstanceName;
this.AzureADTenancyName = azureADTenancyName;
this.AzureADApplicationClientId = azureADApplicationClientId;
this.AzureADApplicationSecret = azureADApplicationSecret;
this.AzureADApplicationAppId = azureADApplicationAppId;
string authority = string.Format(CultureInfo.InvariantCulture, AzureADInstanceName, AzureADTenancyName);
this.authContext = new AuthenticationContext(authority);
this.clientCredential = new ClientCredential(AzureADApplicationClientId, AzureADApplicationSecret);
}
public async Task ExecuteGetWithAADAutToken<T>(Action<AuthenticationResult> AfterAuthAction)
{
AuthenticationResult result = null;
try
{
result = await authContext.AcquireTokenAsync(this.AzureADApplicationAppId, this.clientCredential);
AfterAuthAction(result);
}
catch (Exception ex)
{
throw;
}
}
}
Saya kemudian menggunakan kelas Auth dan AuthResult untuk memanggil WebApi:
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(getEndPointUri);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", res.AccessToken);
HttpResponseMessage response = await client.GetAsync("/api/field");
if (response.IsSuccessStatusCode)
{
var resultStringJSON = await response.Content.ReadAsStringAsync();
Console.WriteLine(resultStringJSON);
}
else
{
var resulterrorStringJSON = await response.Content.ReadAsStringAsync();
Console.WriteLine(resulterrorStringJSON);
}
}
Respons HttpResponseMessage memberikan Tidak Sah
Saya menggunakan fiddler untuk mendapatkan Permintaan dan Respons:
GET https://xxxxxxxx.azurewebsites.net/api/someapi HTTP/1.1
Accept: application/json
Authorization: Bearer XXXXXXXXX
Host: xxxxxx.azurewebsites.net
HTTP/1.1 401 Unauthorized
Content-Length: 0
Server: Microsoft-IIS/8.0
WWW-Authenticate: Bearer realm="xxxxxxx.azurewebsites.net"
X-Powered-By: ASP.NET
Set-Cookie: ARRAffinity=697493f3974009aeb448f562d1b389f79aa6008071be1244c77f3f1d3849f5f0;Path=/;Domain=xxxxxxxx.azurewebsites.net
Date: Tue, 24 May 2016 03:59:15 GMT
Tolonglah?
Masalah utama yang saya curigai adalah di Azure, Aplikasi AAD tidak memiliki akses ke Aplikasi Web API. Saya mencoba menambahkannya melalui Pengguna tetapi ketika saya mencari Aplikasi itu sebagai pengguna tidak dapat menemukannya. Aplikasi Terdaftar berada di Direktori Azure Active Directory yang berbeda.