Я работал над реализацией аутентификации на основе однонаправленного канала JWT. Я пытаюсь получить ключи publi c с URL-адреса JWKS сервера аутентификации и загрузить его в JsonWebKeySet. Вот мой код класса ConfigureServices:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(o=> { o.AddPolicy("AllowAnyOrigin", b=> b.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()); });
services.Configure<MvcOptions>(o => { o.Filters.Add(new CorsAuthorizationFilterFactory("AllowAnyOrigin")); });
var p = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
services.AddMvc(o=> {
o.Filters.Add(new AuthorizeFilter(p));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
// configure strongly typed settings objects
var appSettingsSection = Configuration.GetSection("AppSettings");
services.Configure<AppSettings>(appSettingsSection);
// configure jwt authentication
var appSettings = appSettingsSection.Get<AppSettings>();
//var key = Encoding.ASCII.GetBytes(appSettings.Secret);
//Call Auth service URL to get public keys
var jwksJson = Helpers.GetKeyAsync(appSettings.jwksURL).GetAwaiter().GetResult();
//load keys from JWKS
var jwks = new JsonWebKeySet(jwksJson);
var issuerSigningKeys = jwks.Keys.ToList();
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKeys = issuerSigningKeys,
//IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false
};
});
// configure DI for application services
services.AddScoped<IUserService, UserService>();
}
А вот мой метод Configure
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseCors("AllowAnyOrigin");
app.UseAuthentication();
app.UseMvc();
}
Этот код прекрасно работает, когда я запускаю API на локальном компьютере (IIS Express) ) с моим angular интерфейсом и почтальоном. Однако при развертывании этого кода в контейнере Linux на основе Openshift я всегда получаю сообщение об ошибке 401: «Подпись недействительна». Я использую один и тот же токен для аутентификации как в локальном, так и в Openshift контейнере. Хотите знать, если контейнер на основе Linux вызывает проблему.