如何使用 OpenIddict 使刷新/注销刷新和访问令牌无效(使用内存数据库)

iqu*_*lis 5 c# logout asp.net-core openiddict refresh-token

我有一个使用 OpenIddict 的 .NET Core 2.1 Web API 项目。

TLDR:按照此处给出的示例,我需要用于执行注销请求以使一个用户的刷新令牌和访问令牌无效/注销的示例。

长版:

它涉及多个 API 用户使用用户名和密码检索访问令牌 + 刷新令牌。我正在寻找一种可能性,可以使具有有效访问/刷新令牌的特定 API 用户的两个令牌失效/注销。

我在尝试编写一条用于使用单个用户的当前刷新令牌“注销”访问令牌和刷新令牌的路线时迷失了。

我们不使用 SignInManager。我在网上看到了几个例子。但我没有找到任何与我们简单的内存方法相匹配的东西。TokenManager 没有 SignOut 方法。

Startup.cs 上的 ConfigureServices() 部分如下所示:

services.AddDbContext<DbContext>(options =>
{
    options.UseInMemoryDatabase(nameof(DbContext));
    options.UseOpenIddict();
});

services.AddOpenIddict().AddCore(options =>
{
    options.UseEntityFrameworkCore().UseDbContext<DbContext>();
});

services.AddOpenIddict().AddServer(options =>
{
    options.UseMvc();

    options.EnableTokenEndpoint("/api/token").EnableLogoutEndpoint("/api/logout");

    options.AllowPasswordFlow();
    options.AllowRefreshTokenFlow();
    options.SetAccessTokenLifetime(TimeSpan.FromSeconds(60 * 60));
    options.SetRefreshTokenLifetime(TimeSpan.FromSeconds(7 * 24 * 60 * 60));
    options.RegisterScopes(OpenIdConnectConstants.Scopes.OfflineAccess);

    options.DisableHttpsRequirement();
    options.UseRollingTokens();
    options.AcceptAnonymousClients();
});

services.AddOpenIddict().AddValidation();

services.AddAuthentication(options =>
{
    options.DefaultScheme = OAuthValidationDefaults.AuthenticationScheme;
});
Run Code Online (Sandbox Code Playgroud)

检索访问令牌和使用刷新令牌工作得很好。

但是我在注销路由中使用什么?

    [HttpGet]
    [Route("/api/logout")]
    public async Task<IActionResult> LogoutAsync(OpenIdConnectRequest logoutRequest)
    {
        // ???
    }
Run Code Online (Sandbox Code Playgroud)

尝试某事。如下所示,向我展示了一个几乎为空的 logoutRequest 参数(一切均为空,并且只有 Properties 填充了我们拥有 logout_request 的信息。

    [HttpGet]
    [Route("/api/logout")]
    public async Task<IActionResult> LogoutAsync(OpenIdConnectRequest logoutRequest)
    {
        var result = SignOut(OpenIdConnectServerDefaults.AuthenticationScheme);

        return result;
    }
Run Code Online (Sandbox Code Playgroud)