由于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令牌的声明。
我对所有建议持开放态度,但确实应该有一种方法可以在授权处理程序中获取访问令牌,但我可能错了。
提前感谢您的时间。
答案 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完成。