我尝试创建一个asp-mvc API,它读取传入请求上的jwt声明,然后将它们镜像回用户-我的用例是我尝试调查不同端点失败的原因,我从外部服务获得一个令牌,所以我希望最小化/不对它进行授权,我只想检查声明。
我有以下控制器和终结点:
[ApiController]
[Route("api/[controller]")]
public class TestController : ControllerBase
{
[HttpGet]
[Route("testclaims")]
public async Task<ActionResult<string?>> TestClaims()
{
List<string> result = new List<string>();
foreach (var claim in HttpContext.User.Claims)
result.Add($"{claim.Type}: {claim.Value}");
return "{ " + String.Join(", ", result.ToArray()) + " }";
}
}
我的应用程序设置如下:
...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme,
options => {
options.TokenValidationParameters = new TokenValidationParameters
{
RequireExpirationTime = false,
RequireSignedTokens = false,
RequireAudience = false,
SaveSigninToken = false,
TryAllIssuerSigningKeys = false,
ValidateActor = false,
ValidateAudience = false
};
builder.Configuration.Bind("JwtSettings", options);
});
var app = builder.Build();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
我从postman调用端点,我使用包含一组已知声明的auth令牌发出请求,HttpContext.User.Claims
总是空的,但我可以看到HttpContext.Request.Headers
包含预期的令牌,如果我在外部解码它,它将包含声明。
我尝试过向端点添加Authorize装饰器,但是当我这样做时,我得到一个没有日志或调试信息的401返回。
我假设我需要启用一些东西来让asp填充索赔?
1条答案
按热度按时间ds97pgxw1#
您需要使用
[Authorize]
。此外,你错过了你的
app.UseAuthorization();
之前的app.UseAuthentication();
。试试看,希望能帮到你。