Скажите, пожалуйста, почему этот код не работает?

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.AddAuthentication(options =>
        {
            options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme;
        }).AddJwtBearer(options =>
        {
            options.RequireHttpsMetadata = false;
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidIssuer = AuthOptions.ISSUER,
                ValidateAudience = true,
                ValidAudience = AuthOptions.AUDIENCE,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = AuthOptions.GetSymmetricSecurityKey()
            };
        });

        services.AddDbContext<ApplicationContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        services.AddIdentity<User, IdentityRole>().AddEntityFrameworkStores<ApplicationContext>();
        services.AddMvc();
    }

    // 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.UseDeveloperExceptionPage();
        }

        app.UseAuthentication();

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

Я попытался удалить options.Default* и заменить его только на JwtBearerDefaults.AuthenticationScheme. Только если я изменю [Authorize] на [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)], это сработает. Но я не хочу использовать свойство AuthenticationSchemes для каждого атрибута.

1
FoxNet 11 Мар 2018 в 04:36

1 ответ

Лучший ответ

services.AddIdentity(…) настраивает ASP.NET Core Identity, который регистрирует несколько схем проверки подлинности файлов cookie с использованием проверки подлинности файлов cookie, которые необходимы для работы авторизации на основе форм.

В рамках этого он также устанавливает схемы аутентификации и проверки по умолчанию для IdentityConstants.ApplicationScheme.

Поскольку вы вызываете AddIdentity после AddAuthentication, конфигурация по умолчанию, которую вы сделали для последнего, будет перезаписана конфигурацией идентификации. Итак, чтобы решить вашу проблему, вам необходимо убедиться, что вы установили схемы по умолчанию в параметрах идентификации после регистрации идентификатора.

services.AddIdentity<User, IdentityRole>()
    .AddEntityFrameworkStores<ApplicationContext>();;

services.AddAuthentication(options =>
{
    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme;
})
    .AddJwtBearer(…);

Обратите внимание, что это очевидно остановит cookie проверки подлинности ASP.NET Core Identity в качестве схемы проверки подлинности и проверки по умолчанию. Поэтому, если в вашем приложении также есть области, в которых вы не используете JWT Bearer, они перестанут работать и потребуют явных атрибутов Authenticate для переключения обратно на идентификационный файл cookie.

6
poke 11 Мар 2018 в 04:54