Azure AD - HTTP / 1.1 401 Неавторизовано - Служба Windows

Возникла проблема с аутентификацией Azure. Получение 401 Unauthorized при вызове WebAPI, размещенного в Azure.

Вот основы: следовал этому руководству - https://azure.microsoft.com/en-us/documentation/samples/active-directory-dotnet-daemon/

Зарегистрировано 2 приложения:

  1. Служба Windows
  2. WebAPI

Служба Windows вызывает STS и успешно получает JWT. Затем он пытается передать этот токен в WebAPI, размещенный на azurewebsites.net.

Вот мой код для вызова STS (просто завернутый в класс аутентификации):

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;
        }
    }
}

Затем я использую этот класс Auth и AuthResult для вызова 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);
    }
}

Ответ HttpResponseMessage дает Неавторизованный

Я использовал скрипач, чтобы получить запрос и ответ:

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

Помогите, пожалуйста?

Я подозреваю, что основная проблема заключается в том, что в Azure приложение AAD не имеет доступа к приложению веб-API. Я попытался добавить его через Users, но когда я ищу это приложение как пользователь, он не может его найти. Зарегистрированные приложения находятся в другом каталоге Azure AD.


person Fox    schedule 24.05.2016    source источник
comment
Случайно вы включили Аутентификацию / Авторизацию на портале? Несколько человек сталкивались с аналогичными проблемами, когда использовали как интегрированную аутентификацию / авторизацию, так и промежуточное ПО для аутентификации OWIN Azure AD в одном и том же веб-приложении.   -  person Chris Gillum    schedule 24.05.2016
comment
Привет @Phillippe. Да, я включил эту аутентификацию в веб-приложении на портале. Разве это не обязательно?   -  person Fox    schedule 24.05.2016
comment
Извините, @ChrisGillum. Вы разместили этот комментарий.   -  person Fox    schedule 24.05.2016
comment
@ChrisGillum. Просто был момент лампочки. Ты прав. Я включил этот параметр аутентификации Azure, который был неправильным! В этом auth и заключается проблема. Я считаю, что UseWindowsAzureActiveDirectoryBearerAuthentication - это все, что нужно   -  person Fox    schedule 24.05.2016
comment
Какой api вы хотите вызвать? Ошибка указывает на то, что ваш токен доступа не может получить доступ к этому api ...   -  person Lily_user4045    schedule 24.05.2016
comment
Спасибо @ Lily_user4045. Проблема обнаружена, нужно просто проверить ее, но Крис решил ее своим ответом   -  person Fox    schedule 24.05.2016
comment
@ChrisGillum. Если вы можете опубликовать свой как ответ, я отмечу его как ответ :-)   -  person Fox    schedule 24.05.2016
comment
@Fox отлично! Я разместил свой комментарий как ответ. :)   -  person Chris Gillum    schedule 24.05.2016


Ответы (1)


Случайно вы включили Аутентификацию / Авторизацию на портале? Несколько человек сталкивались с аналогичными проблемами, когда использовали как интегрированную аутентификацию / авторизацию, так и промежуточное ПО для аутентификации OWIN Azure AD в одном и том же веб-приложении. Правильный способ настроить ваше приложение - использовать одно или другое, потому что в настоящее время они плохо сочетаются друг с другом.

person Chris Gillum    schedule 24.05.2016
comment
Удалена аутентификация Azure AD и это исправлено. - person Fox; 24.05.2016