gpt4 book ai didi

c# - 使用 .net 核心 Web API 验证 .net 控制台应用程序

转载 作者:行者123 更新时间:2023-12-05 08:36:11 24 4
gpt4 key购买 nike

我有一个 .net core 3.1 web API,它是用 JWT 身份验证构建的,它与 Angular UI 集成并且按预期工作。

下面是我的JWT认证中间件


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

// Adding Jwt Bearer
.AddJwtBearer(options =>
{
options.SaveToken = true;
options.RequireHttpsMetadata = false;
options.IncludeErrorDetails = true;
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = false,
ValidateAudience = false,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JWT:Secret"]))
};
options.Events = new JwtBearerEvents
{
OnAuthenticationFailed = context =>
{
if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
{
context.Response.Headers.Add("Token-Expired", "true");
}
return Task.CompletedTask;
}
};
});

现在我需要创建一些更多的 Web API 方法,这些方法将被 Angular UI 以及一些现有的计划任务(.net 控制台应用程序 将使用为内部操作创建的 web api 方法,并将在后台运行。

我的 API Controller 装饰有 [Authorize] 属性。它在 Angular UI 上运行良好,其中身份验证和授权是使用 JWT 不记名 token 实现的。现在的问题是计划任务的集成没有获取 token 的逻辑。

如何在身份验证方面将这些控制台应用程序与 .net 核心 Web API 集成?最简单的选择(我认为)是创建一个用户登录名,用户名为“servicetask”,并根据该用户名获取 token 并执行 API 操作(但这需要更多的努力,因为控制台应用程序越来越多,有些也来自其他项目的应用程序)。

在这种情况下有什么方法可以处理身份验证吗?

  1. 从控制台应用程序传递一些 API key 并通过 Web API 中的身份验证是一种好的做法吗?那可能吗 ?那么在.net core web api中如何处理请求呢?

  2. 是否可以为这些服务帐户创建任何 JWT 角色或声明并验证它们?

请帮忙。

最佳答案

最好的方法是同时允许不记名 token 和 API key 授权,特别是因为您允许用户和(内部)服务访问。

添加 API key 中间件(我个人使用 this ,使用起来很简单 - 包名称是 AspNetCore.Authentication.ApiKey)和自定义验证(将 API key 与常规用户数据一起存储在数据库中)或者在配置中,无论你喜欢什么)。修改 Controller 上的 [Authorize] 属性,以便可以使用 Bearer 和 ApiKey 授权。 Angular 应用程序继续使用 Bearer 身份验证,并且任何服务/控制台应用程序(或任何其他客户端,如果在某些情况下需要,包括 Angular 客户端)发送包含分配给该应用程序的 API key 的 X-Api-Key header 。

中间件配置应如下所示:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddApiKeyInHeader(ApiKeyDefaults.AuthenticationScheme, options =>
{
options.KeyName = "X-API-Key";
options.SuppressWWWAuthenticateHeader = true;
options.Events = new ApiKeyEvents
{
// A delegate assigned to this property will be invoked just before validating the api key.
OnValidateKey = async (context) =>
{
var apiKey = context.ApiKey.ToLower();
// custom code to handle the api key, create principal and call Success method on context. apiUserService should look up the API key and determine is it valid and which user/service is using it
var apiUser = apiUserService.Validate(apiKey);
if (apiUser != null)
{
... fill out the claims just as you would for user which authenticated using Bearer token...
var claims = GenerateClaims();
context.Principal = new ClaimsPrincipal(new ClaimsIdentity(claims, context.Scheme.Name));
context.Success();
}
else
{
// supplied API key is invalid, this authentication cannot proceed
context.NoResult();
}
}
};
})
// continue with JwtBearer code you have
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, x => ...

这整理了 Startup.cs 部分。

现在,在您想要同时启用 Bearer 和 ApiKey 身份验证的 Controller 中,修改属性,使其看起来像这样:

[Route("api/[controller]")]
[ApiController]
[Authorize(AuthenticationSchemes = "ApiKey, Bearer")]
public class SomeController : ControllerBase

现在,Angular 客户端仍将以相同的方式工作,但控制台应用程序可能会像这样调用 API:

using (HttpClient client = new HttpClient())
{
// header must match definition in middleware
client.DefaultRequestHeaders.Add("X-API-Key", "someapikey");
client.BaseAddress = new Uri(url);
using (HttpResponseMessage response = await client.PostAsync(url, q))
{
using (HttpContent content =response.Content)
{
string mycontent = await content.ReadAsStringAsync();
}
}
}

我认为这种方法充分利用了 AuthenticationHandler并提供最简洁的方法来处理使用 JWT 的“常规”客户端和使用固定 API key 的服务,紧跟类似 OAuth middleware 的内容. More details关于构建自定义身份验证处理程序,如果有人想从头开始构建类似的东西,基本上实现任何类型的身份验证。

当然,缺点是这些 API key 的安全性,即使您仅将它们用于内部服务也是如此。通过使用声明限制这些 API key 的访问范围,而不是对多个服务使用相同的 API key 并定期更改它们,可以稍微解决这个问题。此外,如果不使用 SSL,API key 很容易被拦截 (MITM),因此请注意这一点。

关于c# - 使用 .net 核心 Web API 验证 .net 控制台应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69926026/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com