Я работаю над проектом ASP.NET Core и недавно добавил пользовательские службы авторизации в файл Program.cs:
После этого я столкнулся со следующей ошибкой при доступе к моему приложению:
URL
https://localhost:44340/Identity/Account/Login?ReturnUrl=%2FIdentity%2FAccount%2FLogin%3FReturnUrl%3D%252FIdentity%252FAccount%252FLogin%253FReturnUrl%253D%25252FIdentity%25252FAccount%25252FLogin%25253FReturnUrl%25253D%2525252FIdentity%2525252FAccount%2525252FLogin%2525253FRet
HTTP Ошибка 404.15 – Не найдено
Модуль фильтрации запросов настроен так, чтобы отклонять запросы, где строка запроса слишком длинная.
Файл Program.cs:
builder.Services.AddSingleton<IAuthorizationPolicyProvider, PermissionPolicyProvider>();
builder.Services.AddScoped<IAuthorizationHandler, PermissionAuthorizationHandler>();
builder.Services.Configure<SecurityStampValidatorOptions>(options =>
{
options.ValidationInterval = TimeSpan.Zero;
});
using Microsoft.AspNetCore.Authorization;
namespace UserManagement.Filters
{
public class PermissionRequirement : IAuthorizationRequirement
{
public string Permission { get; private set; }
public PermissionRequirement(string permission)
{
Permission = permission;
}
}
}
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Options;
namespace UserManagement.Filters
{
public class PermissionPolicyProvider : IAuthorizationPolicyProvider
{
public DefaultAuthorizationPolicyProvider FallbackPolicyProvider { get; }
public PermissionPolicyProvider(IOptions<AuthorizationOptions> options)
{
FallbackPolicyProvider = new DefaultAuthorizationPolicyProvider(options);
}
public Task<AuthorizationPolicy> GetDefaultPolicyAsync()
{
return FallbackPolicyProvider.GetDefaultPolicyAsync();
}
public Task<AuthorizationPolicy> GetFallbackPolicyAsync()
{
return FallbackPolicyProvider.GetDefaultPolicyAsync();
}
public Task<AuthorizationPolicy> GetPolicyAsync(string policyName)
{
if (policyName.StartsWith("Permission", StringComparison.OrdinalIgnoreCase))
{
var policy = new AuthorizationPolicyBuilder();
policy.AddRequirements(new PermissionRequirement(policyName));
return Task.FromResult(policy.Build());
}
return FallbackPolicyProvider.GetPolicyAsync(policyName);
}
}
}
using Microsoft.AspNetCore.Authorization;
using System.Linq;
using System.Threading.Tasks;
namespace UserManagement.Filters
{
public class PermissionAuthorizationHandler : AuthorizationHandler<PermissionRequirement>
{
public PermissionAuthorizationHandler()
{
}
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement)
{
if (context.User == null)
return;
var canAccess = context.User.Claims.Any(c => c.Type == "Permission" && c.Value == requirement.Permission && c.Issuer == "LOCAL AUTHORITY");
if (canAccess)
{
context.Succeed(requirement);
return;
}
}
}
}
Ответ
Ошибка 404.15 в ASP.NET Core возникает, когда строка запроса в URL слишком длинная, и модуль фильтрации запросов настроен на отказ в таких случаях. В вашем случае это происходит после добавления пользовательских служб авторизации, и проблема может быть связана с рекурсивными вызовами URL, которые в результате создают длинную строку запроса.
Вот шаги, которые могут помочь вам решить эту проблему:
-
Проверьте логику редиректов: В вашем приложении может быть проблема с избыточной перенаправкой. Проверьте, не происходит ли бесконечный цикл перенаправления из-за неправильной настройки маршрутизации или авторизации. Убедитесь, что логика авторизации не приводит к повторным вызовам той же самой страницы с дополнительными параметрами
ReturnUrl
. -
Измените обработку
ReturnUrl
: Возможно, вам нужно изменить, как обрабатывается параметрReturnUrl
. Например, если вы не хотите его передавать, когда пользователь уже на странице входа, вы можете добавить проверку, чтобы избежать повторных добавлений.Измените метод перенаправления в контроллере входа, например:
if (someCondition) // условие, когда не требуется перенаправление { return RedirectToAction("Login"); }
-
Настройка длины строки запроса: Если вы уверены, что длинные строки запроса необходимы, вы можете изменить настройки IIS (если используете его) или настройки Kestrel, чтобы разрешить более длинные строки запросов. Для IIS это можно сделать в файле
web.config
:<system.webServer> <security> <requestFiltering> <requestLimits maxQueryString="2048" /> </requestFiltering> </security> </system.webServer>
Для Kestrel, в вашем файле
Program.cs
можно настроить:builder.WebHost.ConfigureKestrel(serverOptions => { serverOptions.Limits.MaxRequestLineSize = 8192; // например serverOptions.Limits.MaxQueryStringSize = 2048; // например });
-
Отладка авторизационной логики: Убедитесь, что ваша логика авторизации, особенно в
PermissionAuthorizationHandler
, не создает ненужных или рекурсивных запросов. Изучите, как ваши права доступа накладывают ограничения на обработку запросов пользователя. -
Логирование и отслеживание: Включите более детальное логирование для вашего приложения, чтобы вы могли увидеть, какие именно запросы и параметры передаются через систему. Это поможет диагностировать, почему появляются длинные строки запроса.
- Тестирование: После внесения изменений протестируйте приложение, чтобы убедиться, что ошибка 404.15 больше не появляется и что вы можете успешно входить в систему.
Если вы продолжаете сталкиваться с проблемами, пожалуйста, поделитесь конкретными логами или кодом, который вызывает проблемы, чтобы более точно определить причину ошибки.