.Net Core 2.x Перенаправление на страницу ошибок - PullRequest
0 голосов
/ 14 мая 2018

У меня есть простое веб-приложение ASP.Net Core 2.0, и я включил Аутентификацию Windows в свойстве проекта, включив Аутентификацию Windows и отключив анонимную аутентификацию.

Для авторизации на уровне приложений / Фильтрация на уровне группы безопасности ADУ меня есть следующий код в Startup.cs:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        services.AddAuthentication(IISDefaults.AuthenticationScheme);

        services.AddMvc(config =>
        {
            var policy = new AuthorizationPolicyBuilder()
                                .RequireAuthenticatedUser()
                                .RequireRole("Application - Administrator")
                                .Build();
            config.Filters.Add(new AuthorizeFilter(policy));
        });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseBrowserLink();
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseStaticFiles();

        app.UseAuthentication();

        //app.UseStatusCodePagesWithRedirects("/Home/Error/{0}");
        //app.UseStatusCodePagesWithReExecute("/Home/Error", "?statusCode={0}");

        app.UseStatusCodePagesWithReExecute("/Home/Error/{0}");



        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

Для обработки кода состояния Http 403, когда неавторизованный пользователь пытается получить доступ к приложению, он будет перенаправлен на пользовательскую страницу ошибки.Итак, я попробовал следующие 3 подхода в методе Configure в Startup.cs:

app.UseStatusCodePagesWithRedirects("/Home/Error/{0}");
app.UseStatusCodePagesWithReExecute("/Home/Error", "?statusCode={0}");
app.UseStatusCodePagesWithReExecute("/Home/Error/{0}");

В HomeController я попробовал как метод Error по умолчанию

public IActionResult Error()
{
    return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}

, так и индивидуальный для обработки определенныхкод состояния:

public IActionResult Error(string errCode)
{
    if (errCode == "500" || errCode == "404" || errCode == "403")
    {
        return View($"~/Views/Error/{errCode}.cshtml");
    }

    return View("~/Views/Shared/Error.cshtml");
}

И у меня есть простая страница ошибки 403.cshtml в папке / Views / Error /.

Но ни одна из них не работает, все отображают эту страницу: enter image description here

Мне интересно, что я пропустил или забыл реализовать для отображения отформатированной страницы с ошибкой?

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Я не уверен на 100%, но должно быть 2 варианта аутентификации Windows:

  1. Хост допускает только аутентифицированных пользователей

    • Когда вы включаете Windows Authentication и отключаете Anonymous Users
    • [Authorize] и [AllowAnonymous] безрезультатно, потому что запросы, не прошедшие проверку подлинности, никогда не достигают вашего приложения
    • Следовательно, вам не нужно / не нужно настраивать глобальный фильтр. Возможно, вам придется настроить дружественные страницы ошибок на сервере?

      public class Startup
      {
          public IConfiguration Configuration { get; }
      
          public Startup(IConfiguration configuration)
          {
              Configuration = configuration;
          }
      
          public void ConfigureServices(IServiceCollection services)
          {
              services.AddMvc();
          }
      
          public void Configure(IApplicationBuilder app, IHostingEnvironment env)
          {
              if (env.IsDevelopment())
              {
                  app.UseDeveloperExceptionPage();
              }
              else
              {
                  app.UseExceptionHandler("/home/error");
              }
      
              app.UseStaticFiles();
      
              app.UseMvcWithDefaultRoutes();
          }
      } 
      
  2. Хост допускает как анонимных, так и аутентифицированных пользователей

    • При включении Windows Authentication и Anonymous Users
    • [Authorize] требуется дополнительная настройка на Startup.cs

      public void ConfigureServices(IServiceCollection services)
      {
          services.AddAuthentication(IISDefaults.AuthenticationScheme);
      
          services.AddMvc(config =>
          {
              var policy = new AuthorizationPolicyBuilder()
                 .RequireRole("Application - Administrator")
                 .Build();
      
              config.Filters.Add(new AuthorizeFilter(policy));
          });
      }
      
      public void Configure(IApplicationBuilder app, IHostingEnvironment env)
      {
          ...
      
          app.UseStatusCodePagesWithReExecute("/error", "?code={0}");
      
          app.UseAuthentication();
      
          app.UseMvcWithDefaultRoutes();
      }
      
    • Вам нужно использовать [AllowAnonymous] на контроллере ошибок, чтобы переопределить глобальный фильтр [Authorize] для разрешения анонимных запросов.

      [AllowAnonymous]
      public class ErrorController : Controller
      {
          public IActionResult Index(int? code)
          {
              ...
          }
      }
      
0 голосов
/ 16 июня 2019

Попробуйте app.UseStatusCodePagesWithRedirects("/Home/Error/{0}"); в файле startup.configure (приложение IApplicationBuilder, среда IHostingEnvironment)

Работает в веб-приложении ASP.NET CORE2.0

Он будет обрабатывать любые ошибки HTTP

0 голосов
/ 14 мая 2018

Проблема в методе Error, он пропустил атрибут AllowAnonymous, чтобы разрешить анонимный доступ к методу error, когда пользователь не прошел авторизацию. Кредит @ Calc

...