不带重定向的承载令牌WEB API asp.net核心

时间:2016-09-29 06:07:59

标签: authentication asp.net-core jwt bearer-token asp.net-core-webapi

我是asp.net核心新手。我试图使用jwt身份验证和Google,Facebook等的OpenOauth创建一个小型Web服务...

我已阅读此帖: https://stormpath.com/blog/token-authentication-asp-net-core

这篇文章是关于在ASP.Net核心中使用jwt进行身份验证,但是,我还要验证用户是否在我的系统中被禁用或处于活动状态

我的数据库有一个包含4列的表:Id,Name,Password,Status(0 - Disabled | 1 - Active)。

我怎样才能达到目标?

有人可以帮我吗?

P / S:我已经在google上搜索了关于jwt的完整教程,但是有很少的东西。感谢认证流程的完整源代码。

1 个答案:

答案 0 :(得分:1)

我测试了三种方式(它们有效,但我不知道哪种方法正确)。

首先使用OnTokenValidated事件:

 OnTokenValidated = async (ctx) =>
 {
       if(user is disabled)
       {
           ctx.Response.Headers.Append(
                        HeaderNames.WWWAuthenticate,
                        ctx.Options.Challenge);
           ctx.SkipToNextMiddleware();
       }
 }

其次是在jwt中间件之后使用Use方法:

        app.Use(async (context, next) =>
        {
            var auth = await context.Authentication.AuthenticateAsync("Bearer");
            if (auth.Identity.IsAuthenticated && user is disabled)
            {
                context.Response.Headers.Append(
                      HeaderNames.WWWAuthenticate,
                      "Bearer");
            }
            await next();
        });

最后一次使用SecurityTokenValidators

public class CustomSecurityTokenValidator  : JwtSecurityTokenHandler
{
    public CustomSecurityTokenValidator()
    {
    }

    public override ClaimsPrincipal ValidateToken(string securityToken,
        TokenValidationParameters validationParameters, out SecurityToken validatedToken)
    {
        var principal = base.ValidateToken(securityToken, validationParameters, out validatedToken);
        if(user is disabled)
        {
            throw new SecurityTokenNotYetValidException();
        }
        else
        {
            return principal;
        }
    }
}

..... in Startup.cs ...........
var options = new JwtBearerOptions()
{
     //....
}
options.SecurityTokenValidators.Clear();
options.SecurityTokenValidators.Add(new CustomTokenValidator());
app.UseJwtBearerAuthentication(options);