oauth2.0 IdentityServer创建和撤销API令牌

qlzsbp2j  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(159)

我有一个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
似乎我可以使用可注入的ITokenService创建具有生存期的令牌。
我仍然没有找到一个默认的方式来撤销令牌。

pkln4tw6

pkln4tw61#

我认为IdentityServer不是处理API令牌的正确工具。IdentityServer可以处理的是Oauth客户端及其机密,但这只允许支持Oauth的客户端创建可以直接在API端点上使用的令牌。服务器端会话只在服务器端存储用户数据,而不是在cookie中,因此这不是正确的选择。
在我看来,正确的处理方法是创建一个自定义的AuthenticationHandler,可能类似于以下内容:https://rmauro.dev/api-key-authentication-extending-the-native-implementation/
在那里,您可以访问存储API令牌的dbcontext,并可以验证它们。
然后,您可以使用AddPolicyScheme在api身份验证或自定义方案之间切换。
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;
        };
    });

相关问题