У меня такое чувство, будто я прочитал каждое сообщение на Stack Overflow, и ничто не соответствует моему сценарию. У меня есть веб-сайт ASP.NET Core, который использует платформу Microsoft Identity для аутентификации. Это настраивается вызовом:
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(options => ...)
Затем я использую утверждения на основе ролей, чтобы определить, кому разрешен доступ к веб-сайту. Когда пользователь проходит аутентификацию, я заполняю его роли группами безопасности, членами которых он является (используя Graph для поиска членства в группах).
Вот полный блок аутентификации:
// Setup Graph and authentication
private static void ConfigureAuthentication(
IServiceCollection services,
ConfigurationManager configuration)
{
var initialScopes =
configuration["DownstreamApi:Scopes"]?.Split(' ') ??
configuration["MicrosoftGraph:Scopes"]?.Split(' ');
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(options =>
{
configuration.Bind("AzureAd", options);
options.TokenValidationParameters.RoleClaimType = "groups";
options.AccessDeniedPath = "/Error/AccessDenied";
options.ErrorPath = "/Error/Error";
options.Events.OnTokenValidated = async context =>
{
if (context != null)
{
var allGroupIds = GetConfigurationGroups(configuration);
await ClaimHelpers.PopulateGroupClaims(context, allGroupIds);
}
};
})
.EnableTokenAcquisitionToCallDownstreamApi(options =>
configuration.Bind("AzureAd", options), initialScopes)
.AddMicrosoftGraph(configuration.GetSection("MicrosoftGraph"))
.AddInMemoryTokenCaches();
services.AddControllersWithViews().AddMicrosoftIdentityUI();
}
// Populate the authorization policies and set the default.
private static void ConfigureGroupAuthorization(
IServiceCollection services,
ConfigurationManager configuration)
{
services.AddAuthorization(p =>
{
p.AddPolicy(PolicyNames.PortalUser, policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireRole(configuration["Groups:PortalUserGroupID"]!);
});
});
services.AddAuthorization(options =>
{
options.FallbackPolicy = options.GetPolicy(PolicyNames.PortalUser);
options.DefaultPolicy = options.GetPolicy(PolicyNames.PortalUser)!;
});
}
Все работает нормально, за исключением случаев, когда у кого-то нет правильного утверждения. Затем они перенаправляются на https://localhost:44321/MicrosoftIdentity/Account/AccessDenied?ReturnUrl=%2F
.
Это не то, чего я хочу. Я хочу, чтобы неавторизованные пользователи направляли мое специальное /Error/AccessDenied
действие. Я не хочу, чтобы они направлялись на обратный вызов Microsoft Identity по умолчанию.
Мне нужно сообщить своим пользователям, к какой группе безопасности им следует присоединиться, если они не смогут получить доступ к странице. Что мне нужно изменить или настроить, чтобы пользователи перенаправлялись на /Error/AccessDenied
вместо Microsoft Identity? Нужно ли мне что-то изменить в регистрации приложения Azure?
Если какая-то моя терминология неверна, пожалуйста, поправьте ее. Я все еще изучаю ASP.NET Core.
Я прочитал много подобных постов.
Это, вероятно, самый похожий пост, но он не обеспечивает перенаправления: Как переопределить маршрут Identity AccessDenied по умолчанию в ASP.NET CORE MVC
Посоветовался с нашим старшим инженером, но он не знаком с проблемой. Попробовал задать
AddMicrosoftIdentityWebApp
на самом деле использует схему cookie, вам следует настроить путь запрета доступа следующим образом...
...
services.Configure<CookieAuthenticationOptions>(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
options.AccessDeniedPath = new PathString("/Error/AccessDenied");
});
...