Аутентификация в .NET Core Web API не активируется - PullRequest
0 голосов
/ 06 июня 2019

Пытаюсь активировать схему аутентификации токена JWT в .net core web api.Это не активация вообще.

Я настроил Swagger для получения токена и предоставления потребителю доступа API ко всем его контроллерам.Но он просто позволяет каждому получить доступ, а не проверять, существует ли действительный токен.

Я пытался поместить ключевое слово [Authorize] на все контроллеры, но оно все еще не работает.

Здесь я предоставляю свой файл startup.cs

namespace Web.Api
{
    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            Configuration = builder.Build();
        }

        public IConfiguration Configuration { get; }

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

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddOptions();

            services.AddSwaggerDocumentation();

            // CORS Configurations
            services.AddCors(options =>
            {
                options.AddPolicy("AllowAllOrigins",
                    builder =>
                    {
                        builder
                            .AllowAnyOrigin()
                            .AllowAnyHeader()
                            .AllowAnyMethod();
                    });
            });

            // Authentication Configurations
            services.Configure<TokenManagement>(Configuration.GetSection("Jwt"));
            var token = Configuration.GetSection("Jwt").Get<TokenManagement>();
            var secret = Encoding.ASCII.GetBytes(token.Key);

            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(options =>
            {
                options.RequireHttpsMetadata = false;
                options.SaveToken = true;
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ClockSkew = TimeSpan.FromMinutes(5),
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = token.Issuer,
                    ValidAudience = token.Audience,
                    IssuerSigningKey = new SymmetricSecurityKey(secret)
                };
            });

            services.AddRouting(options => options.LowercaseUrls = true);

            services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
            services.AddScoped<IUnitOfWork, UnitOfWork>();

            services.AddScoped<IUrlHelper>(implementationFactory =>
            {
                var actionContext = implementationFactory.GetService<IActionContextAccessor>().ActionContext;
                return new UrlHelper(actionContext);
            });

            services.AddVersionedApiExplorer(o => o.GroupNameFormat = "'v'VVV");
            services.AddMvcCore()
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
                .AddFormatterMappings()
                .AddJsonFormatters();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApiVersionDescriptionProvider provider)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseCors(x => x.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
            app.UseAuthentication();
            app.UseSwaggerDocumentation(provider);

            app.UseMvc(routes =>
            {
                routes.MapRoute("API Default", "api/{controller}/{action}/{id?}");
                routes.MapRoute("Printers Default", "api/{controller}/{action}/{vendorDriver}/{vendormodel}");
            });
        }
    }
}

Ответы [ 4 ]

1 голос
/ 07 июня 2019

services.AddMvc() загрузит службу авторизации (AddAuthorization ()):

return services
    .AddMvcCore()
    .AddApiExplorer()
    .AddAuthorization()
    .AddCors()
    .AddDataAnnotations()
    .AddFormatterMappings();

так что вы можете использовать services.AddMvc() или services.AddMvcCore().AddAuthorization()

1 голос
/ 06 июня 2019

Различия между services.AddMvc() и services.AddMvcCore() - это службы, загружаемые в ваше приложение.

AddMvcCore() добавляет только обязательные службы для запуска приложения Asp.net, а AddMvc() загружает часто используемые службы.

0 голосов
/ 06 июня 2019

Ну, я просто добавил строку

services.AddMvc (). SetCompatibilityVersion (CompatibilityVersion.Version_2_2);

Я не знаю, почему строка

services.AddMvcCore() .SetCompatibilityVersion (CompatibilityVersion.Version_2_2) не активирует его

0 голосов
/ 06 июня 2019

Я покажу вам, как я это сделал в своем проекте (я использую ASP.NET Core 2.2 )


// Inside ConfigureServices

services.AddAuthentication().AddCookie().AddJwtBearer(cfg => {
     cfg.TokenValidationParameters = new TokenValidationParameters()
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        ValidIssuer = configuration["Tokens:Issuer"],
        ValidAudience = configuration["Tokens:Audience"],
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["Tokens:Key"]))
    };
});

// Inside Configure
    app.UseAuthentication();

// In the controllers that need Authentication
    [ApiController]
    [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
    public class SampleController : ControllerBase {

    }

...