.net 尽管JWT包含声明,但HttpContext.User.Claims始终为空

e0bqpujr  于 2022-12-14  发布在  .NET
关注(0)|答案(1)|浏览(466)

我尝试创建一个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填充索赔?

ds97pgxw

ds97pgxw1#

您需要使用[Authorize]
此外,你错过了你的app.UseAuthorization();之前的app.UseAuthentication();

app.UseAuthentication();
 app.UseAuthorization();

试试看,希望能帮到你。

相关问题