Проверка подлинности 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 описывает обработчик для вашего контроллера.