0

Когда я запрашиваю действие контроллера, которое [Authorize] оформлено вместо перенаправления на страницу входа в систему, я получаю ошибку 401.Не удается получить .net core MVC для перенаправления 401 в/Account/Login

Это приложение mnet c .net с использованием шаблона идентификации, работающего на IIS express.

Когда я запускаю приложение из program.cs, перенаправление на вход работает нормально. Я добавил четкие указания для аутентификации cookie для использования/переадресации/входа/входа как для раздела конфигурации, так и для службы, а также для настройки Identity для выполнения этой перенаправления.

Я не могу заставить его работать. Ниже мой класс StartUp, что я должен изменить, чтобы он работал в IIS express ?:

public class Startup 
{ 
    private MapperConfiguration _mapperConfiguration { get; set; } 

    public Startup(IHostingEnvironment env) 
    { 
     var builder = new ConfigurationBuilder() 
      .SetBasePath(env.ContentRootPath) 
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true); 

     if (env.IsDevelopment()) 
     { 
      // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709 
      builder.AddUserSecrets(); 
     } 

     builder.AddEnvironmentVariables(); 
     Configuration = builder.Build(); 

     _mapperConfiguration = new MapperConfiguration(cfg => 
     { 
      cfg.AddProfile(new AutoMapperProfileConfiguration()); 
     }); 
    } 

    public IConfigurationRoot Configuration { get; } 

    // This method gets called by the runtime. Use this method to add services to the container. 
    public void ConfigureServices(IServiceCollection services) 
    { 
     // Add framework services. 
     services.AddDbContext<ApplicationDbContext>(options => 
      options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 


     services.AddIdentity<ApplicationUser, IdentityRole>(
      option => { 
       option.Cookies.ApplicationCookie.LoginPath = "/Account/Login"; 
       option.Cookies.ApplicationCookie.AutomaticChallenge = true; 
       option.Cookies.ApplicationCookie.AutomaticAuthenticate = true; 
      }) 
      .AddEntityFrameworkStores<ApplicationDbContext>(); 

     services.AddDataProtection(); 

     services.AddMvc(); 
     services.AddSignalR(); 

     // Add application services. 
     services.AddTransient<IEmailSender, AuthMessageSender>(); 
     services.AddTransient<ISmsSender, AuthMessageSender>(); 
     services.Configure<AuthMessageSenderOptions>(Configuration); 
     services.Configure<IISOptions>(options => options.AutomaticAuthentication = true); 
     services.AddSingleton<IMapper>(sp => _mapperConfiguration.CreateMapper()); 
    } 

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, ApplicationDbContext context, RoleManager<IdentityRole> roleManager) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 



     app.UseStaticFiles(); 

     app.UseIdentity(); 

     // Add external authentication middleware below. To configure them please see http://go.microsoft.com/fwlink/?LinkID=532715 

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

     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationScheme = "MyCookies", 
      SlidingExpiration = true, 
      AutomaticAuthenticate = true, 
      AutomaticChallenge = true, 
      LoginPath = new PathString("/Account/Login") 
     }); 
     app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 
      routes.MapRoute(
       name: "index", 
       template: "{controller=Home}/{id?}", 
       defaults: new { action = "Index" }); 
     }); 
     app.UseSignalR(); 

     if (env.IsDevelopment()) 
     { 
      app.UseDeveloperExceptionPage(); 
      app.UseDatabaseErrorPage(); 
      app.UseBrowserLink(); 
     } 
     else 
     { 
      app.UseExceptionHandler("/Home/Error"); 
     } 

     MyDbInit.Init(context, roleManager); 

    } 
} 
+0

'401' означает' User/запрос не authenticated.' –

+0

@ TânNguyễn вы выиграете все интернеты – Josiah

ответ

7

У меня была такая же проблема всю ночь и не удалось найти решение. Запуск сайта непосредственно из Kestrel перенаправлен, но через IIS или IIS Express он просто не перенаправляется - он перейдет на белую страницу.

После публикации в Identity Git, я понял, что мой шаблон настроен для работы под 1.0.1 фреймворка, а не 1.1.0. Я обновил его, чтобы использовать 1.1.0 и обновил все пакеты Nuget до 1.1.0, и теперь он перенаправляется в IIS и IIS Express должным образом.

Я не уверен, что пакет обновил «исправленное» то, что было отвратительно, или если это была просто проблема с 1.0.1, которая была исправлена ​​в 1.1.0.

https://blogs.msdn.microsoft.com/webdev/2016/11/16/announcing-asp-net-core-1-1/

+0

Жизнь спасена! Спасибо –

+0

после обновления всего до ядра ядра 1.1 проблема исчезла. – Josiah

1

Идентификация автоматически добавляет аутентификацию cookie. Вы добавляете его во второй раз в Configure.

Когда вы добавляете второй экземпляр, вы устанавливаете оба автоматических свойства, так что теперь два посредника пытаются выполнить перенаправление, и это поведение «неопределено» (где undefined == «Идти всерьез испортить вещи»,).

+1

Нет, я только начал поиск неисправностей после того, как не смог работать. Даже после прямой настройки перенаправления он не перенаправляет. То, что я добавляю в configure, - это явные указания по использованию перенаправления на 401. Это отлично работает при автономной работе. Он не работает в IIS. Вы даже читаете брах? – Josiah