使用jwt授权检查Asp.net核心中的用户验证

时间:2018-03-31 09:08:15

标签: asp.net asp.net-web-api asp.net-core asp.net-identity access-token

我在网络API中实现了Microsoft Identity和JWT, 客户端可以登录并获取JWT令牌并将其存储在应用程序中。 由于令牌到期,用户可以访问服务器, 但如果我从我的数据库中删除用户,删除的用户仍然有其令牌,可以访问web api, 我该如何检查用户的验证?

2 个答案:

答案 0 :(得分:1)

一个选项是在JwtBearerEvent OnTokenValidated事件上验证当前用户,该事件将在每次成功验证后触发

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options => {

        options.Events = new JwtBearerEvents
            {
                OnTokenValidated = context =>
                {
                    var userService = ServiceProvider.GetService<IUserService>();
                    if(userService.IsUserRemoved(context.Principal.Identity.Name))
                        context.Fail("User is removed");

                    return Task.CompletedTask;
                }
            };
        });

注意:在此示例中,我使用ServiceProvider来获取IUserService的实例,该实例作为参数存储在Startup.cs类中。在ConfigureServices方法中初始化为ServiceProvider = services.BuildServiceProvider();。 IUserService是一个包装类,您需要实现IsUserRemoved方法,该方法将对您的用户提供程序实现进行操作。

答案 1 :(得分:0)

另一个选择是实现并注册您自己的SecurityTokenValidator。为此,您需要创建一个实现ISecurityTokenValidator接口的类:

//using Microsoft.IdentityModel.Tokens

public class CustomValidator : ISecurityTokenValidator
{
   //interface implementation
   ...
}

并通过JwtBearerOptions.SecurityTokenValidators property将其注册为额外的令牌验证器:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer( options => {

        options.SecurityTokenValidators.Add(new CustomValidator()) 
    });