我有一个在 .NET 4.8 上运行的 ASP.NET MVC 应用程序,它创建和共享 JWT 令牌并维护用户会话。
我有一个 ASP.NET Core 3.1 Web API 微服务,它使用
RSACryptoServiceProvider
验证 JWT 令牌。
.NET Core 有没有办法检查用户是否仍然登录?
注意:在 ASP.NET MVC 应用程序中,我们使用
ApplicationSessionState
进行检查。
在asp.net core中,通常我们会使用身份验证中间件和身份验证服务(例如JWT身份验证服务)来检查用户是否经过身份验证。
然后在控制器内部,我们可以通过使用用户的声明来检查用户状态,并
User.Identity.IsAuthenticated
检查用户是否登录。
简而言之,在 ASP.NET Core 中,如果客户端发送带有正确身份验证令牌的请求,并且该令牌通过了身份验证中间件,则会将 IsAuthenticated 属性设置为 ture,这意味着用户已登录。
如果您想使用自定义逻辑来检查令牌,一种可能的方法是使用 asp.net core AuthorizationHandler。
更多详情,可以参考以下代码:
定制需求类别:
public class CustomAuthenticationRequirement : IAuthorizationRequirement
{
}
自定义处理程序:
public class CustomAuthenticationHandler : AuthorizationHandler<CustomAuthenticationRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthenticationRequirement requirement)
{
//your previous codes to check the user
if (context.Resource is HttpContext authorizationFilterContext)
{
if (authorizationFilterContext.Request.Headers.ContainsKey("Authorization"))
{
//
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, "aa")
};
var identity = new ClaimsIdentity(claims, "custom");
var principal = new ClaimsPrincipal(identity);
authorizationFilterContext.User = principal;
context.Succeed(requirement);
//}
}
}
return Task.CompletedTask;
}
private bool IsAuthorizedUser(string username, string password)
{
return username == "test" && password == "pass";
}
}
Program.cs,对于 3.1,您将
builder.Services.AddAuthorization
替换为 services.AddAuthorization
。
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("CustomAuthentication", policy =>
policy.Requirements.Add(new CustomAuthenticationRequirement()));
});
builder.Services.AddSingleton<IAuthorizationHandler, CustomAuthenticationHandler>();
结果: