На Azure портале Azure не работает авторизация с ролями.
У меня есть образец, как легко настроить authorization
входить в систему пользователей из моего Azure
active directory
арендатор. Я сделал только одно изменение в этом коде, я отметил HomeController своей реализацией AuthorizeAttribute, поскольку пользователь не может находиться на моей странице без аутентификации / авторизации.
[Authorize(Roles = "Admin")]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
authorization
Конфигурация указана ниже.
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"];
string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = authority,
PostLogoutRedirectUri = postLogoutRedirectUri,
RedirectUri = postLogoutRedirectUri,
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthenticationFailed = context =>
{
context.HandleResponse();
context.Response.Redirect("/Error?message=" + context.Exception.Message);
return Task.FromResult(0);
}
}
});
}
Этот код хорошо работает на моей локальной машине (я изменяю параметр конфигурации PostLogoutRedirectUri на https://localhost:port для локальной работы). Я могу получить Azure Active Directory
Пользовательские данные и сделать фильтрацию атрибутов администратором role
, Также хорошо работают такие методы, как IsInRole. Но при развертывании этого кода на портале Azure в браузере появляется следующая ошибка: у вас нет прав для просмотра этого каталога или страницы.,
Когда я открываю поток журнала портала, я вижу разметку страницы ошибки 403 с таким текстом: Ошибка HTTP 403.60 - Запрещено.
Моя конфигурация портала ниже:
- В списке служб приложений у меня есть приложение с именем:WebApp-OpenIDConnect.
- В контроле доступа (IAM) - я вижу своего пользователя, который имеет
Owner
роль. - Я настроил раздел аутентификации / авторизации с включением аутентификации службы приложений. Кроме того, я установил значение Вход в систему с помощью Azure Active Directory в действии, когда запрос не прошел проверку подлинности, а также настроил Azure Active Directory с созданием нового приложения Azure Add.
- у меня уже есть
Azure active directory
группа с именем " Admin ". На странице обзора я вижу, что мой пользователь является членом этой группы. Я добавил описание ролей в манифест регистрации приложения, как показано ниже.
"appRoles": [ { "allowedMemberTypes": ["User"], "displayName": "Admin", "id": "637b0b37-####-####-####-############", "isEnabled": true, "description": "Admin description", "value": "Admin" }]
В
Azure Active Directory
/Enterprise applications
/User and groups
Я добавил своего пользователя и назначил ему роль администратора.- Я проверил, что ClientId из моего app.config имеет тот же идентификатор, что и идентификатор приложения на странице регистрации приложения.
-
Kudu
(App services
/Advanced tools
) показывает мне следующие настройки приложения:- WEBSITE_AUTH_DEFAULT_PROVIDER "AzureActiveDirectory"
ОБНОВЛЕНИЕ: Если я удалю параметр Roles="Admin" из атрибута (оставьте только Authorize()), авторизация будет работать правильно, и даже сбор заявок содержит значение роли администратора в roles
Запрос. Но когда я возвращаю параметр Roles обратно, снова появляется ошибка 403.
ОБНОВЛЕНИЕ 2: Я думаю, что проблема связана с различиями в типах ролей претензий. Когда я запускаю свое приложение локально. У меня есть имя типа заявки с пространством имен и в единой форме: http://schemas.microsoft.com/ws/2008/06/identity/claims/role (значение Admin), но когда я запускаю свое приложение на портале Azure Я вижу имя типа заявки во множественном числе и без пространства имен: role (значение равно Admin, как и предыдущее).
ОБНОВЛЕНИЕ3 Я попытался обновить имя RoleClaimType в своем разделе конфигурации, как показано ниже, пытаясь изменить несоответствие между типом утверждения роли в коллекции утверждений и ожидаемым RoleClaimType в ClaimsIdentity
объект:
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = authority,
PostLogoutRedirectUri = postLogoutRedirectUri,
RedirectUri = postLogoutRedirectUri,
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthenticationFailed = context =>
{
context.HandleResponse();
context.Response.Redirect("/Error?message=" + context.Exception.Message);
return Task.FromResult(0);
}
},
TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
{
ValidateIssuer = false,
RoleClaimType = "roles",
}
});
но после развертывания моего приложения в Azure тип заявки по-прежнему имеет старое значение: RoleClaimType = http://schemas.microsoft.com/ws/2008/06/identity/claims/role и не был изменен моими изменениями конфигурации. Когда я запускаю локально - имя типа меняется.
Может ли кто-нибудь помочь с этим? Благодарю.