我有一个 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。有什么办法可以做到这一点吗?
您可以使用自定义中间件来实现标头令牌验证。逻辑是在服务器验证后再添加一个令牌验证。
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();
服务器经过身份验证,令牌经过验证,端点命中。