ASP.NET Core – Ошибка 404.15 после добавления служб авторизации

Вопросы и ответы

Я работаю над проектом 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, которые в результате создают длинную строку запроса.

Вот шаги, которые могут помочь вам решить эту проблему:

  1. Проверьте логику редиректов: В вашем приложении может быть проблема с избыточной перенаправкой. Проверьте, не происходит ли бесконечный цикл перенаправления из-за неправильной настройки маршрутизации или авторизации. Убедитесь, что логика авторизации не приводит к повторным вызовам той же самой страницы с дополнительными параметрами ReturnUrl.

  2. Измените обработку ReturnUrl: Возможно, вам нужно изменить, как обрабатывается параметр ReturnUrl. Например, если вы не хотите его передавать, когда пользователь уже на странице входа, вы можете добавить проверку, чтобы избежать повторных добавлений.

    Измените метод перенаправления в контроллере входа, например:

    if (someCondition) // условие, когда не требуется перенаправление
    {
       return RedirectToAction("Login");
    }
  3. Настройка длины строки запроса: Если вы уверены, что длинные строки запроса необходимы, вы можете изменить настройки 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; // например
    });
  4. Отладка авторизационной логики: Убедитесь, что ваша логика авторизации, особенно в PermissionAuthorizationHandler, не создает ненужных или рекурсивных запросов. Изучите, как ваши права доступа накладывают ограничения на обработку запросов пользователя.

  5. Логирование и отслеживание: Включите более детальное логирование для вашего приложения, чтобы вы могли увидеть, какие именно запросы и параметры передаются через систему. Это поможет диагностировать, почему появляются длинные строки запроса.

  6. Тестирование: После внесения изменений протестируйте приложение, чтобы убедиться, что ошибка 404.15 больше не появляется и что вы можете успешно входить в систему.

Если вы продолжаете сталкиваться с проблемами, пожалуйста, поделитесь конкретными логами или кодом, который вызывает проблемы, чтобы более точно определить причину ошибки.

Оцените материал
Добавить комментарий

Капча загружается...