繁体   English   中英

使用 OpenId Connect 在.Net Core API 中强制注销

[英]Forced Logout in .Net Core API using OpenId Connect

基本上,当用户单击注销时,我们会从客户端删除令牌。

现在,问题是,如果用户打开 2 个不同的选项卡并在一个选项卡中单击注销,这将删除令牌并注销。 完全没问题。 但在另一个选项卡中,令牌仍然存在。 如果用户执行某些功能,那么相同的令牌将由服务器成功验证并返回非常糟糕的响应,我们想要限制它。

那么我们怎样才能从服务器强制注销呢? 在这里,是我们正在使用的,

我在 my.Net Core 6 Api 项目中使用 OpenIdDict 进行登录。 我已经提到了 OpenIdDict 官方存储库

基本上,成功登录后,我们的 API 会向前端返回一个 Token,以便我们的 API 验证同一用户以授予其他 API 端点的访问权限。 这可以。

现在,让我详细介绍一下我们的用户管理。 一旦一个新用户在我们的门户中注册,基本上使用一个前端(这是一个 Angular 应用程序),它调用我们的.Net core API。 Our.Net Core API 不会将用户详细信息保存到我们的数据库中。 它的作用是,我们的寄存器 API 内部调用外部 API 最终将用户详细信息保存在该数据库中。 对于登录,our.Net core API 调用外部 API 来验证那里。

这意味着我们的.Net Core API 只是主要 API 的包装器。 现在,我们已将 OpenIdConnect 添加到 .Net Core API(这只是一个包装器)。 到这为止就好了。

有人可以帮忙吗,我怎样才能从服务器端强制注销或过期/删除令牌?

这是我的 program.cs 文件中的一些代码

builder.Services.AddOpenIddict()
    .AddCore(options =>
    {
        options.UseEntityFrameworkCore()
               .UseDbContext<ApplicationDbContext>();
    })
        .AddServer(options =>
        {
            // Enable the token endpoint.options.SetTokenEndpointUris("/Connect/Token").SetLogoutEndpointUris("/Connect/Logout");
            options.AllowPasswordFlow()
                   .AllowRefreshTokenFlow();
            options.AcceptAnonymousClients();
            options.AddDevelopmentEncryptionCertificate()
                   .AddDevelopmentSigningCertificate();
            options.UseAspNetCore()
                   .EnableTokenEndpointPassthrough().
                   EnableLogoutEndpointPassthrough().DisableTransportSecurityRequirement();
            
        })

我们的注销方法:

[HttpPost("~/Connect/Logout"), Produces("application/json")]
public async Task<IActionResult> Logout()
{
    return SignOut(
        authenticationSchemes: OpenIddictServerAspNetCoreDefaults.AuthenticationScheme,
        properties: new AuthenticationProperties
        {
            RedirectUri = "https://localhost:****/Connect/Token"
        });
}

logout 方法不应返回任何内容,更合适的 logout 方法应如下所示:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task Logout()
{
    await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    await HttpContext.SignOutAsync(OpenIdConnectDefaults.OpenIddictServerAspNetCoreDefaults );

    //Important, this method should never return anything.
}

此外,最好从两个处理程序中退出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM