AuthorizationFilterContext 无法获取内容

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

我正在使用 Microsoft.AspNetCore.Authentication.JwtBearer Microsoft.AspNetCore.Authentication.OpenIdConnect

我已经写了代码:

    [Authorize]
    [ApiVersion("1.0")]
    [ApiController]
    [Route("api/v{version:apiVersion}/[controller]")]
    public class UsersController : ControllerBase
    {

    }

授权类就像这样:

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class AuthorizeAttribute : Attribute, IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationFilterContext context)
        {
            var user = (User)context.HttpContext.Items["User"];
            if (user == null)
            {
                context.Result = new JsonResult(new { message = "Unauthorized" })
                { StatusCode = StatusCodes.Status401Unauthorized };
            }
        }
    }

我使用 swagger 来发送这样的请求:

curl -X 'GET' \
  'https://localhost:7056/api/v1.0/TourLists' \
  -H 'accept: text/plain' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEiLCJuYmYiOjE2OTUwMjk4OTQsImV4cCI6MTY5NTExNjI5NCwiaWF0IjoxNjk1MDI5ODk0fQ.z_ak0QjRt3XFVWArvQOgeYALFyGyoJIXlfL5msKfT-Y'

错误在于: var user = (User)context.HttpContext.Items["用户"]; 用户为空。

//user is null
var user = (User)context.HttpContext.Items["User"];

我不知道为什么用户为空。

谁能告诉我如何解决它?谢谢

我希望用户类获得内容然后我将访问成功。

swagger authorization
1个回答
0
投票

记得添加如下代码:

app.UseMiddleware<JwtMiddleware>();

那就完美了

    public class JwtMiddleware
{
    private readonly RequestDelegate _next;
    private readonly AuthSettings _authSettings;

    public JwtMiddleware(RequestDelegate next, IOptions<AuthSettings> appSettings)
    {
        _next = next;
        _authSettings = appSettings.Value;
    }

    public async Task Invoke(HttpContext context, IUserService userService)
    {
        var token = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last();

        if (token != null)
            AttachUserToContext(context, userService, token);

        await _next(context);
    }

    private void AttachUserToContext(HttpContext context, IUserService userService, string token)
    {
        try
        {
            var tokenHandler = new JwtSecurityTokenHandler();
            byte[] key = Encoding.ASCII.GetBytes(_authSettings.Secret);
            tokenHandler.ValidateToken(token, new TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(key),
                ValidateIssuer = false,
                ValidateAudience = false,
                ClockSkew = TimeSpan.Zero
            }, out var validatedToken);

            var jwtToken = (JwtSecurityToken)validatedToken;
            var userId = int.Parse(jwtToken.Claims.First(c => c.Type == "id").Value);

            context.Items["User"] = userService.GetById(userId);
        }
        catch
        {
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.