В настоящее время я пытаюсь узнать, как создать безопасный api с использованием токена-носителя, я все время получаю эту ошибку (InvalidOperationException: политика авторизации с именем: 'Bearer' не найдена.), И я не уверен, почему. Я использую asp.net-core 2.0 и пытаюсь использовать промежуточное ПО jwt auth. Вот мой стартап, любая помощь будет принята с благодарностью!
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
const string TokenAudience = "ExampleAudience";
const string TokenIssuer = "ExampleIssuer";
private RsaSecurityKey key;
private TokenAuthOptions tokenOptions;
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)
{
var keyParams = RSAKeyUtils.GetRandomKey();
key = new RsaSecurityKey(keyParams);
tokenOptions = new TokenAuthOptions()
{
Audience = TokenAudience,
Issuer = TokenIssuer,
SigningCredentials = new SigningCredentials(key, SecurityAlgorithms.RsaSha256Signature)
};
services.AddDbContext<VulnerabilityContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddScoped<LoggingActionFilter>();
services.AddScoped<VulnsService>();
services.AddAuthentication(o =>
{
o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(o =>
{
o.Authority = "https://localhost:54302";
o.Audience = tokenOptions.Audience;
o.RequireHttpsMetadata = false;
});
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)
{
//app.UseSession();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseAuthentication();
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}





Вы получаете эту ошибку, потому что схемы аутентификации и политики авторизации - это не одно и то же. Посмотрим, что из себя представляет каждый из них.
Это разные методы аутентификации в вашем приложении. В опубликованном вами коде у вас есть одна схема аутентификации, которая определяется именем Bearer и указанными вами параметрами.
В одном приложении можно настроить несколько схем аутентификации:
AddJwtBearer. Также важно отметить, что имя схемы аутентификации должно быть уникальным, поэтому вам нужно будет использовать перегрузка, которая принимает имя и делегат конфигурации параметровКогда пользователь аутентифицируется в вашем приложении, это не означает, что он может получить доступ ко всем функциям в нем. У вас могут быть разные уровни доступа, где администраторы имеет особые права, которых никто другой не имеет; это выражается в ASP.NET Core с помощью политик авторизации. Я настоятельно рекомендую вам прочитать официальная документация по авторизации, поскольку я считаю его отличным.
Политика авторизации состоит из двух вещей:
Взяв пример администраторы, упомянутый выше, мы можем создать вымышленную политику авторизации:
Administratorsrole со значением Administrators.В коде это можно выразить так:
services.AddAuthorization(options =>
{
options.AddPolicy("Administrators", new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.RequireClaim("role", "Administrators")
.Build());
});
Затем вы можете применить эту политику к некоторым конкретным контроллерам или действиям в своем приложении, украсив их атрибутом [Authorize(Policy = "Administrators")]. Затем MVC во время запроса выполнит требования к текущему пользователю и определит, могут ли они получить доступ к конкретной функции.
Я предполагаю, что вы добавили такой атрибут в одно из своих действий / контроллеров, но вы не зарегистрировали имена политик авторизации Bearer в системе авторизации.
Если ваша цель - предотвратить доступ неаутентифицированных пользователей к некоторым действиям, вы можете применить атрибут [Authorize]. Это приведет к запуску политика по умолчанию, который по умолчанию требует только аутентификации пользователя.
Я не работаю с политиками, и эта ошибка произошла со мной, когда я забыл указать роли в атрибуте авторизации.
У меня было такое:
[Authorize("Administrator")] // if you don't specify the property name Roles it will consider it as the policy name
Исправлено, изменив его на:
[Authorize(Roles = "Administrator")]
Добавление AuthenticationSchemes в класс контроллера работает для меня:
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]