C# 在ASP.NET MVC Core中强制注销
我使用的是ASP.NETMVCCore,我有以下代码,这是一项日常任务,如果用户的订阅结束,它会将用户设置为“过期”。 但如果他们当前已登录,我如何检查并强制他们注销C# 在ASP.NET MVC Core中强制注销,c#,asp.net,.net,asp.net-mvc,asp.net-core,C#,Asp.net,.net,Asp.net Mvc,Asp.net Core,我使用的是ASP.NETMVCCore,我有以下代码,这是一项日常任务,如果用户的订阅结束,它会将用户设置为“过期”。 但如果他们当前已登录,我如何检查并强制他们注销 public interface IExpirationJob { Task SetExpired(); } public class ExpirationJob : IExpirationJob { private readonly ApplicationDbContext _db; privat
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();
}
}
非常感谢您的帮助。您可以向用户模型添加
GUID
类型的SecurityStamp
属性,并将SecurityStamp
设置为cookie
或jwt
令牌
然后,当用户登录时,您必须将SecurityStamp
值更改为新值,并将SecurityStamp
保存到cookie中,用户向应用程序发送请求时,您必须检查保存在cookie中的SecurityStamp
数据库中用户的SecurityStamp
。若这些属性不相等,则必须拒绝用户并设置“注销用户”
公共静态异步任务ValidateAsync(CookieValidatePrincipalContext)
{
context=context??抛出新ArgumentNullException(nameof(context));
var claimsIdentity=context.Principal.Identity作为claimsIdentity;
if(claimsIdentity?.Claims==null | |!claimsIdentity.Claims.Any())
{
等待被拒绝的主体();
返回;
}
UserManager UserManager=context.HttpContext.RequestServices.GetRequiredService();
var user=await userManager.FindByNameAsync(context.Principal.FindFirstValue(ClaimTypes.NameIdentifier));
if(user==null | | user.SecurityStamp!=context.Principal.FindFirst(new-ClaimsIdentityOptions().SecurityStampClaimType)?.Value)
{
等待被拒绝的主体();
返回;
}
异步任务拒绝主体()
{
context.RejectPrincipal();
wait context.HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
}
}
在启动类中,将ValidateAsync
方法传递到OnValidatePrincipal
并将ValidationInterval
设置为零
services.configureApplicationOK(选项=>
{
//
options.Events=新建CookieAuthenticationEvents
{
OnValidatePrincipal=ValidateAsync
};
}).Configure(选项=>
{
options.ValidationInterval=TimeSpan.Zero;
});
最后,在您的方法中,只需更新SecurityStamp
值,如下所示:
public异步任务SetExpired()
{
foreach(银行机构中的var项目)
{
if(item.SubscriptionEndDate!=null)
{
if(item.subscriptionEndate==DateTime.Today)
{
item.Status=SD.StatusExpired;
//这里我想检查用户是否登录,然后强制注销。
Guid securityStamp=Guid.NewGuid();
item.SecurityStamp=SecurityStamp;
}
}
}
等待_db.SaveChangesAsync();
}
您可以向用户模型添加GUID
类型的SecurityStamp
属性,并将SecurityStamp
设置为cookie
或jwt
令牌
然后,当用户登录时,您必须将SecurityStamp
值更改为新值,并将SecurityStamp
保存到cookie中,用户向应用程序发送请求时,您必须检查保存在cookie中的SecurityStamp
数据库中用户的SecurityStamp
。若这些属性不相等,则必须拒绝用户并设置“注销用户”
公共静态异步任务ValidateAsync(CookieValidatePrincipalContext)
{
context=context??抛出新ArgumentNullException(nameof(context));
var claimsIdentity=context.Principal.Identity作为claimsIdentity;
if(claimsIdentity?.Claims==null | |!claimsIdentity.Claims.Any())
{
等待被拒绝的主体();
返回;
}
UserManager UserManager=context.HttpContext.RequestServices.GetRequiredService();
var user=await userManager.FindByNameAsync(context.Principal.FindFirstValue(ClaimTypes.NameIdentifier));
if(user==null | | user.SecurityStamp!=context.Principal.FindFirst(new-ClaimsIdentityOptions().SecurityStampClaimType)?.Value)
{
等待被拒绝的主体();
返回;
}
异步任务拒绝主体()
{
context.RejectPrincipal();
wait context.HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
}
}
在启动类中,将ValidateAsync
方法传递到OnValidatePrincipal
并将ValidationInterval
设置为零
services.configureApplicationOK(选项=>
{
//
options.Events=新建CookieAuthenticationEvents
{
OnValidatePrincipal=ValidateAsync
};
}).Configure(选项=>
{
options.ValidationInterval=TimeSpan.Zero;
});
最后,在您的方法中,只需更新SecurityStamp
值,如下所示:
public异步任务SetExpired()
{
foreach(银行机构中的var项目)
{
if(item.SubscriptionEndDate!=null)
{
if(item.subscriptionEndate==DateTime.Today)
{
item.Status=SD.StatusExpired;
//这里我想检查用户是否登录,然后强制注销。
Guid securityStamp=Guid.NewGuid();
item.SecurityStamp=SecurityStamp;
}
}
}
等待_db.SaveChangesAsync();
}
您使用哪种身份提供者?ASP.NET MVC Core附带的那个?您使用的是哪种身份提供程序?ASP.NET MVC Core附带的一个?我应该将“ValidateSync”放在哪里?在startup类中的ConfigureService
方法中创建ValidateSync
方法,并将ValidateSync
传递到选项中的OnValidatePrincipal
。事件