在使用引用令牌时基于声明授权用户

时间:2018-01-23 08:58:44

标签: authorization asp.net-identity identityserver4

由于JWT令牌太长,我使用引用令牌来获取用户声明。这可以从客户端控制器正常工作:

var introspectionClient = new IntrospectionClient(
    "http://localhost:5000/connect/introspect",
    "api1",
    "secret");

var response = await introspectionClient.SendAsync(
    new IntrospectionRequest { Token = await HttpContext.GetTokenAsync("access_token") });

ViewBag.Json = Json(response.Json).Value;
return View("json");

我可以使用HttpContext检索访问令牌并在内省端点处为用户声明进行交换。

但是,从授权处理程序,我无法访问HttpContext以获取访问令牌,而AuthorizationHandlerContext仅包含来自ID令牌的声明。

我对所有建议持开放态度,但确实应该有一种方法可以在授权处理程序中获取访问令牌,但我可能错了。

提前感谢您的时间。

1 个答案:

答案 0 :(得分:1)

我不知道你是否应该这样做。但要回答你的问题,你可以注入这样的上下文:

//using Microsoft.AspNetCore.Authentication;

public class MyAuthorizationHandler : AuthorizationHandler<MyRequirement>
{
    private IHttpContextAccessor _httpContextAccessor;

    public MyAuthorizationHandler(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    protected async override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement)
    {
        var token = await _httpContextAccessor.HttpContext.GetTokenAsync("access_token");
    }
}

您需要HandleRequirementAsync异步。您不必在启动时将IHttpContextAccessor添加到服务中。这已经由Identity完成。