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

C# 如何使用OpenIddict(使用内存数据库)使刷新/注销无效并访问令牌,c#,asp.net-core,logout,refresh-token,openiddict,C#,Asp.net Core,Logout,Refresh Token,Openiddict,我有一个使用OpenIddict的.NETCore2.1WebAPI项目 TLDR:根据给出的示例,我需要执行注销请求的示例,以使一个用户的刷新令牌和访问令牌失效/注销 长版本: 它是关于几个API用户使用用户名和密码检索访问令牌+刷新令牌。我正在寻找一种可能性,使具有有效访问/刷新令牌的特定API用户的两个令牌失效/注销 我在尝试编写一个路由以“注销”访问令牌和刷新令牌(当前刷新令牌为单个用户)时失败 我们不使用SignInManager。我在网上看到了几个例子。但我没有发现任何与我们的简单内

我有一个使用OpenIddict的.NETCore2.1WebAPI项目

TLDR:根据给出的示例,我需要执行注销请求的示例,以使一个用户的刷新令牌和访问令牌失效/注销

长版本:

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

我在尝试编写一个路由以“注销”访问令牌和刷新令牌(当前刷新令牌为单个用户)时失败

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

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;
});
services.AddDbContext(选项=>
{
options.UseInMemoryDatabase(nameof(DbContext));
options.UseOpenIddict();
});
services.AddOpenIddict().AddCore(选项=>
{
options.UseEntityFrameworkCore().UseDbContext();
});
services.AddOpenIddict().AddServer(选项=>
{
options.UseMvc();
选项。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);
选项。禁用HttpSrequirement();
options.UseRollingTokens();
options.acceptance非ymousclients();
});
services.AddOpenIddict().AddValidation();
services.AddAuthentication(选项=>
{
options.DefaultScheme=OAuthValidationDefaults.AuthenticationScheme;
});
检索访问令牌并使用刷新令牌工作得非常好

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

    [HttpGet]
    [Route("/api/logout")]
    public async Task<IActionResult> LogoutAsync(OpenIdConnectRequest logoutRequest)
    {
        // ???
    }
[HttpGet]
[路由(“/api/注销”)]
公共异步任务LogoutAsync(OpenIdConnectRequest logoutRequest)
{
// ???
}
尝试以下内容会显示一个几乎为空的logoutRequest参数(所有参数都为null,并且只有属性填充了注销请求的信息)

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

        return result;
    }
[HttpGet]
[路由(“/api/注销”)]
公共异步任务LogoutAsync(OpenIdConnectRequest logoutRequest)
{
var result=SignOut(OpenIdConnectServerDefaults.AuthenticationScheme);
返回结果;
}

1.注销不会使令牌“失效”,而是告诉客户端删除该令牌。客户端可能将令牌存储在javascript内存/浏览器的本地存储/或任何地方…,因此服务器不知道客户端如何存储令牌。因此,在线教程不会向您展示如何注销用户。2。(太长,无法在一条评论中发布)通常,我们会为远程身份验证方案定义一个登录方案。例如,使用cookie方案作为登录方案。在这种情况下,我们可以通过发送一个设置的cookie头来注销cookie方案。由于您没有这样的登录cookie方案,因此您可能会在想要注销时使用一些javascript来删除令牌某个用户。@it减号:在您的第一次评论中:我完全理解。我想让API用户主动告诉我们的服务器使其access+无效,并刷新他获得的用户名和密码令牌。我用这些详细信息更新了问题。1.注销不会“无效”令牌将被删除,但需要告诉客户端删除该令牌。客户端可能将令牌存储在javascript内存/浏览器的localStorage/或任何位置…,因此服务器不知道客户端如何存储令牌。因此,在线教程不会向您展示如何注销用户。2.(太长,无法在单个注释中发布)通常,我们会为远程身份验证方案定义一个登录方案。例如,使用cookie方案作为登录方案。在这种情况下,我们可以通过发送一个设置的cookie头来注销cookie方案。由于您没有这样的登录cookie方案,因此您可能会在想要注销时使用一些javascript来删除令牌某个用户。@it减号:在您的第一次评论中:我完全理解。我想让API用户主动告诉我们的服务器使其access+无效,并刷新他获得的用户名和密码令牌。我用这些详细信息更新了问题。