在ASP中强制注销.NET MVC核心



我正在使用ASP。NetMVC核心,其中我有以下代码,其中它是将用户设置为";过期";如果他们的订阅已经结束。但是,如果他们当前已登录,我如何检查并强制他们注销?

public interface IExpirationJob
{
Task SetExpired();
}
public class ExpirationJob : IExpirationJob
{
private readonly ApplicationDbContext _db;
private readonly IEmailSender _emailSender;
public ExpirationJob(ApplicationDbContext db, IEmailSender emailSender)
{
_db = db;
_emailSender = emailSender;
}
public async Task SetExpired()
{
foreach(var item in _db.Institution)
{
if (item.SubscriptionEndDate != null)
{
if (item.SubscriptionEndDate == DateTime.Today) 
{
item.Status = SD.StatusExpired;
//Here I want to check if the user is logged in, then force logout should be done. 
}
}
}
await _db.SaveChangesAsync();
}
}

非常感谢您的帮助。

您可以将类型为GUIDSecurityStamp属性添加到用户模型中,并将SecurityStamp设置为cookiejwt令牌。

然后当用户登录时,您必须将SecurityStamp值更改为新值并将SecurityStamp保存到cookie中,并且每当用户向应用程序发送请求时,您都必须将保存在cookie中的SecurityStamp与数据库中用户的SecurityStamp进行核对。若这些属性不等于eter,则必须拒绝user并设置sign-out user。

public static async Task ValidateAsync(CookieValidatePrincipalContext context)
{
context = context ?? throw new ArgumentNullException(nameof(context));
var claimsIdentity = context.Principal.Identity as ClaimsIdentity;
if(claimsIdentity?.Claims == null || !claimsIdentity.Claims.Any())
{
await RejectPrincipal();
return;
}
UserManager<IdentityUser> userManager = context.HttpContext.RequestServices.GetRequiredService<UserManager<IdentityUser>>();
var user = await userManager.FindByNameAsync(context.Principal.FindFirstValue(ClaimTypes.NameIdentifier));
if (user == null || user.SecurityStamp != context.Principal.FindFirst(new ClaimsIdentityOptions().SecurityStampClaimType)?.Value)
{
await RejectPrincipal();
return;
}
async Task RejectPrincipal()
{
context.RejectPrincipal();
await context.HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
}
}

在启动类中,将ValidateAsync方法传递给OnValidatePrincipal,并将ValidationInterval设置为零。

services.ConfigureApplicationCookie(options =>
{
//
options.Events = new CookieAuthenticationEvents
{
OnValidatePrincipal = ValidateAsync
};
}).Configure<SecurityStampValidatorOptions>(options =>
{
options.ValidationInterval = TimeSpan.Zero;
});

最后,在您的方法中,只需更新SecurityStamp值,如下所示:

public async Task SetExpired()
{
foreach(var item in _db.Institution)
{
if (item.SubscriptionEndDate != null)
{
if (item.SubscriptionEndDate == DateTime.Today) 
{
item.Status = SD.StatusExpired;
//Here I want to check if the user is logged in, then force logout should be done.     
Guid securityStamp = Guid.NewGuid();
item.SecurityStamp = securityStamp;
}
}
}
await _db.SaveChangesAsync();
}

最新更新