我有一个使用OpenIddict的.NET Core 2.1 Web API项目。
TLDR:在给出here的示例之后,我需要用于执行注销请求的示例,以使一个用户的刷新令牌和访问令牌无效。
长版:
我迷失了试图写一条路由来“注销”访问令牌和刷新令牌以及当前刷新令牌的路径。
我们不使用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;
});
检索访问令牌并使用刷新令牌可以很好地工作。
但是我在注销路由中使用什么?
[HttpGet]
[Authorize]
[Route("/api/logout")]
public async Task<IActionResult> LogoutAsync(OpenIdConnectRequest logoutRequest)
{
// ???
}
尝试某事。如下所示,我看到了一个几乎为空的logoutRequest参数(所有内容均为null,并且只有属性填充了我们拥有logout_request的信息。
[HttpGet]
[Authorize]
[Route("/api/logout")]
public async Task<IActionResult> LogoutAsync(OpenIdConnectRequest logoutRequest)
{
var result = SignOut(OpenIdConnectServerDefaults.AuthenticationScheme);
return result;
}