Проверка подлинности Azure Active Directory - использование OpenId Connect и проверки подлинности на носителе в MVC

Я создал приложение MVC, которое использует аутентификацию Azure Active Directory с OpenId. Это прекрасно работает для конечных пользователей, но я хотел бы добавить на сайт веб-работу, которая будет вызывать собственную конечную точку (тот же метод http post, который будут использовать пользователи). Я нашел этот пример https://github.com/AzureADSamples/Daemon-DotNet который позволяет серверному приложению вызывать конечную точку webapi.

Мой класс конфигурации авторизации выглядит так:

public class StartAuth
{
    private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
    private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
    private static string tenant = ConfigurationManager.AppSettings["ida:Tenant"];
    private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"];
    private static string audience = ConfigurationManager.AppSettings["ida:Audience"];

    string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);

    public void Configuration(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions());

        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = clientId,
                Authority = authority,
                PostLogoutRedirectUri = postLogoutRedirectUri,
            });

        app.UseWindowsAzureActiveDirectoryBearerAuthentication(
            new WindowsAzureActiveDirectoryBearerAuthenticationOptions
            {
                Tenant = tenant,
                TokenValidationParameters = new TokenValidationParameters
                {
                    ValidAudience = audience
                }
            });
    }
}

Запрос от моего веб-консольного приложения выглядит следующим образом (я заменил ключ-носитель и хост):

POST      
https://some-random-host/myendpoint     
HTTP/1.1
Authorization: Bearer key
Host: some-random-host
Content-Length: 0

и ответ от сервера выглядит следующим образом (заменены хост, ключ, идентификатор клиента и усеченное значение местоположения):

HTTP/1.1 302 Found
Cache-Control: private
Content-Length: 0
Location: https://login.windows.net/tenant-id/oauth2/authorize....
Server: Microsoft-IIS/8.0
Set-Cookie: OpenIdConnect.nonce.u%noncekey; path=/; secure; HttpOnly
WWW-Authenticate: Bearer
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Set-Cookie: ARRAffinity=key;Path=/;Domain=some-random-host
Date: Thu, 19 Mar 2015 11:44:11 GMT

Любые идеи, почему сервер отвечает с местоположением входа в систему? Это, очевидно, прекрасно работает, когда пользователи пытаются получить доступ к аутентифицированной конечной точке, но не для моего консольного приложения.

Заранее благодарны за Вашу помощь. Пожалуйста, дайте мне знать, будет ли полезна любая другая информация.

2 ответа

Решение

Поскольку веб-задания Azure не привязаны к конкретному пользователю при аутентификации по ключу, в методе / контроллере нельзя указать атрибут авторизации с указанными пользователями. Это имеет смысл, но я упускал это из виду, пока Омер не напомнил мне проверить атрибуты.

Фактически, пользователь фактически нулевой.

Поэтому вместо того, чтобы иметь: [Authorize(Users="user@contoso.com"] мне нужно было просто: [Authorize]

Я не уверен, есть ли способ указать, что только у WebJob есть разрешения.

Один связанный пост в блоге, который подробно объясняет:

Ваша конфигурация выглядит правильно, но вам не хватает определения для обработчика.

Вам нужно указать обработчик в вашем классе контроллера API:

[HostAuthentication("OAuth2Bearer")]
[Authorize]
public class YourAPIController : ApiController
{

Ключевое слово HostAuthentication описывает обработчик для вашего контроллера.

Другие вопросы по тегам