.NET - 有没有办法验证 httponly 标头和令牌?

问题描述 投票:0回答:1

我有一个 ASP.NET Core 8.0 Web API,配置为使用仅 http JWT 令牌进行身份验证。

这是我创建身份验证和授权的代码:

builder.Services.AddAuthorizationBuilder()
    .AddPolicy("Bearer", new AuthorizationPolicyBuilder()
    .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme‌​)
    .RequireAuthenticatedUser().Build());

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddCookie(opt =>
    {
        opt.Cookie.Name = Token.TokenKey;
    })
    .AddJwtBearer(opt =>
    {
        opt.RequireHttpsMetadata = false;
        opt.SaveToken = true;
        opt.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("myKey")),
            ValidateIssuer = false,
            ValidateAudience = false
        };
        opt.Events = new JwtBearerEvents
        {
            OnMessageReceived = ctx =>
            {
                ctx.Token = ctx.Request.Cookies[Token.TokenKey];
                return Task.CompletedTask;
            }
        };
    });

我的场景:我想使用两个令牌。一种由标头发送,另一种由服务器使用仅 http cookie 管理。我使用这种方法的目标是提高 API 的安全性,以便只有两个令牌都有效时请求才有效。

我的问题:目前,如果我未使用仅 http 的 cookie 进行身份验证,API 仅返回

401 Unauthorized
错误,但如果我在服务器端(使用仅 http 的 cookie)进行身份验证,则请求将到达API,即使不发送标头令牌。

我的问题:我希望仅当用户通过服务器使用仅http cookie进行身份验证并且通过标头发送另一个有效令牌时才能访问API。有什么办法可以做到这一点吗?

authentication authorization asp.net-core-webapi bearer-token cookie-httponly
1个回答
0
投票

您可以使用自定义中间件来实现标头令牌验证。逻辑是在服务器验证后再添加一个令牌验证。

1.定义你的中间件

public class ValidateHeaderTokenMiddleware
{
    private readonly RequestDelegate _next;

    public ValidateHeaderTokenMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        if (context.User.Identity.IsAuthenticated)
        {
            var headerToken = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last();

            // Custom vaidation logic
            if (!IsValidToken(headerToken))
            {
                context.Response.StatusCode = 401; // Unauthorized
                await context.Response.WriteAsync("Invalid header token.");
                return;
            }
        }

        await _next(context);
    }

    private bool IsValidToken(string token)
    {
        // Custom vaidation logic
        return true;
    }
}

2.在程序中注册服务

app.UseAuthentication();
app.UseMiddleware<ValidateHeaderTokenMiddleware>();
app.UseAuthorization();

服务器经过身份验证,令牌经过验证,端点命中。

© www.soinside.com 2019 - 2024. All rights reserved.