要将JwtSecurityToken的受众设置为当前请求者的URL/主机,您可以使用ASP.Net Core的中间件来解决这个问题。以下是一个解决方案的代码示例:
public class AudienceMiddleware
{
private readonly RequestDelegate _next;
public AudienceMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
// 获取当前请求的URL/主机
var request = context.Request;
var url = $"{request.Scheme}://{request.Host}";
// 将URL/主机存储到上下文中
context.Items["Audience"] = url;
await _next.Invoke(context);
}
}
在Startup.cs文件的Configure方法中注册中间件类,以确保它在请求处理管道中正确地执行:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// ...
app.UseMiddleware();
// ...
}
在您的控制器中,您可以使用HttpContext.Items获取存储在上下文中的URL/主机,并将其设置为JwtSecurityToken的受众:
[Route("api/[controller]")]
[ApiController]
public class MyApiController : ControllerBase
{
[HttpGet]
public IActionResult GetToken()
{
// 获取当前请求的URL/主机
var audience = HttpContext.Items["Audience"].ToString();
// 创建JwtSecurityToken,并设置受众
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateJwtSecurityToken(
audience: audience,
// 其他属性...
);
// 返回token
return Ok(token);
}
}
这样,当您调用GetToken方法时,它将返回一个包含当前请求URL/主机作为受众的JwtSecurityToken。
请注意,您还需要在控制器中添加其他所需的属性(如颁发者、加密密钥等),这里只提供了一个简化的示例。