Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET MVC Core中强制注销_C#_Asp.net_.net_Asp.net Mvc_Asp.net Core - Fatal编程技术网

C# 在ASP.NET MVC Core中强制注销

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

我使用的是ASP.NETMVCCore,我有以下代码,这是一项日常任务,如果用户的订阅结束,它会将用户设置为“过期”。 但如果他们当前已登录,我如何检查并强制他们注销

   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
。事件