#c# #.net-core #azure-web-app-service #asp.net-core-webapi #azure-api-management
#c# #.net-core #azure-web-app-service #asp.net-core-webapi #azure-api-management
Вопрос:
У нас есть .Net Core Web API, размещенный в службе приложений Azure, и у нас есть собственный сервер идентификации для генерации токена доступа. Мы добавили наш веб-API в Azure API Management, поэтому все запросы к web API должны проходить через API Management.
Для обеспечения безопасности операций API мы будем отправлять токен доступа, сгенерированный сервером идентификации, во всех запросах. Итак, мы хотели проверить токен доступа, мы добавили аутентификацию в управление API при обработке входящих операций API, как показано ниже, потому что мы не хотим, чтобы несанкционированный запрос был остановлен при управлении API без обращения к серверному API.
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
<openid-config url="https://<our-identity-server-URL>/.well-known/openid-configuration" />
</validate-jwt>
Он работает нормально, все запросы без токена доступа выдают 401 несанкционированный ответ, и все запросы с действительным токеном доступа попадают в веб-API.
Теперь мы хотим авторизовать наши запросы, проверив, присутствует ли требуемая область в маркере доступа или нет. НО поскольку мы уже выполняем аутентификацию в управлении API, мы не хотим снова проходить аутентификацию в коде Web API. Итак, мы написали только код авторизации в файле StartUp.cs, как показано ниже,
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication("Bearer").AddJwtBearer("Bearer", config =>
{
config.Authority = "<our Identity Server URL>";
config.TokenValidationParameters = new TokenValidationParameters()
{
ValidateAudience = false
};
});
services.AddAuthorization(options =>
{
options.AddPolicy("ApiScope", policy =>
{
policy.RequireClaim("scope","Allow_BackEnd_Service");
});
});
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
//app.UseAuthentication(); (It is working only if I add this line)
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
Но этот код всегда возвращает 401 несанкционированный результат. Если я добавлю «приложение.Используйте аутентификацию();» в методе Configure в классе Startup.cs он работает. Но мы не хотим снова добавлять аутентификацию в Web API.
Возможно ли выполнить только авторизацию в .net Core Web API? Если нет, если мне нужно добавить «приложение.UseAuthentication();», какова будет задержка? будет ли это проблемой с производительностью?
Комментарии:
1. Какие-либо обновления по этой проблеме?
2. Спасибо, Джой, управление API работает должным образом с вашим вводом. Но разве мы не можем выполнять только авторизацию в Web API без аутентификации?
3. Не уверен, я не очень хорошо знаком с .net Core Web API.
Ответ №1:
В этом случае вы можете напрямую использовать required-claims
политику in APIM для проверки токена scope
in.
Пример:
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
<openid-config url="https://<our-identity-server-URL>/.well-known/openid-configuration" />
<required-claims>
<claim name="scp" match="any" separator=" ">
<value>Users.Read</value>
</claim>
</required-claims>
</validate-jwt>
Затем, если область действия в моем декодированном токене такая, как показано ниже, политика проверит, находится ли Users.Read
он в области видимости, если он существует, токен действителен.