【问题标题】: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;
            };
        });
    

    【讨论】:

      猜你喜欢
      • 2014-06-06
      • 2017-06-20
      • 1970-01-01
      • 2019-04-12
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-14
      相关资源
      最近更新 更多