【问题标题】:IdentityServer Create and Revoke API TokensIdentityServer 创建和撤销 API 令牌
【发布时间】:2022-11-30 03:11:32
【问题描述】:
我有一个 asp.net 核心托管的 blazor 应用程序使用
builder.Services.AddIdentity<IdentityUser, IdentityRole>(options =>
{
// ...
}
.AddEntityFrameworkStores<ApplicationDbContext>()
和
builder.Services.AddIdentityServer()
.AddApiAuthorization<IdentityUser, ApplicationDbContext>()
我想添加一个功能,用户可以通过传递(可选的)到期日期和名称来创建 api 令牌。
创建的令牌应该是可撤销的。
理想情况下,令牌仅限于 api 端点。
ServerSideSessions 是要走的路吗?
由于 IdentityServer 正在轮换密钥,它是否能够验证 +1 年前颁发的令牌?
这样做的原因是,我们有监控系统,监控来自该 api 的数据。这些系统只能发出 http 调用,没有 oauth 集成。
编辑
我找到了https://github.com/DuendeSoftware/Samples/blob/main/IdentityServer/v6/PAT/src/IdentityServer/Pages/PAT/Index.cshtml.cs
似乎我可以使用 Injecable ITokenService 创建具有生命周期的令牌。
我仍然没有找到撤销令牌的默认方法。
【问题讨论】:
标签:
c#
asp.net-core
oauth-2.0
duende-identity-server
【解决方案1】:
我认为 IdentityServer 不是处理 API 令牌的正确工具。 IdentityServer 可以处理的是 Oauth 客户端及其机密,但这只允许支持 oauth 的客户端创建可以直接在 API 端点上使用的令牌。服务器端会话只是将用户数据存储在服务器端而不是 cookie 中,因此这不是正确的选择。
在我看来,正确的处理方法是创建一个自定义的 AuthenticationHandler 可能与此类似:
https://rmauro.dev/api-key-authentication-extending-the-native-implementation/
在那里,您可以访问 dbcontext,例如存储 API 令牌的地方,您可以验证它们。
然后,您可以使用 AddPolicyScheme 在 apiauthentication 或您的自定义方案之间切换。
https://code-maze.com/dotnet-multiple-authentication-schemes/
大概是这样的:
builder.Services.AddAuthentication( x=> x.DefaultScheme == "TOKEN_OR_JWT")
.AddIdentityServerJwt()
.AddScheme<YourCustomHandler>("YOUR-CUSTOM-SCHEME")
.AddPolicyScheme("TOKEN_OR_JWT", "TOKEN_OR_JWT", options =>
{
// runs on each request
options.ForwardDefaultSelector = context =>
{
// check if an API-TOKEN header is present
string? apiToken = context.Request.Headers["API-TOKEN"];
if (!string.IsNullOrEmpty(apiToken))
return "YOUR-CUSTOM-SCHEME";
// otherwise always use the jwt scheme for identityserver
return IdentityServerJwtConstants.IdentityServerJwtScheme;
};
});