C# ASP.NET核心:将信息从标头传递到控制器的最佳方式是什么
我有一个ASP.NET核心控制器,有几个方法需要在头中传递特定数据。需要澄清的是,数据是包含一些会话信息的JWT令牌。要检索存储在令牌中的信息,我需要执行一些操作: 如果未返回错误请求,则检查标头是否存在 将jwt令牌解码为json字符串 将json字符串映射到模型实例 目前,我在控制器方法中执行所有这些步骤,但这是一种糟糕的做法,因为这是代码复制。我在考虑一些优雅的解决方案,比如创建一个自定义属性并用它装饰方法。但我找不到将数据从属性传递到控制器操作的方法。在我看来,属性是为另一类任务设计的C# ASP.NET核心:将信息从标头传递到控制器的最佳方式是什么,c#,asp.net-core,C#,Asp.net Core,我有一个ASP.NET核心控制器,有几个方法需要在头中传递特定数据。需要澄清的是,数据是包含一些会话信息的JWT令牌。要检索存储在令牌中的信息,我需要执行一些操作: 如果未返回错误请求,则检查标头是否存在 将jwt令牌解码为json字符串 将json字符串映射到模型实例 目前,我在控制器方法中执行所有这些步骤,但这是一种糟糕的做法,因为这是代码复制。我在考虑一些优雅的解决方案,比如创建一个自定义属性并用它装饰方法。但我找不到将数据从属性传递到控制器操作的方法。在我看来,属性是为另一类任务设计的
什么是ASP.NET核心的最佳解决方案?您可以创建一个TypeFilterAttribute,并用它装饰您的控制器/操作。 在TypeFilterAttribute中,您可以使用头执行逻辑,并将结果添加到HttpContext中,然后可以在控制器中检索结果
public class TokenAttribute : TypeFilterAttribute
{
public TokenAttribute() : base(typeof(TokenFilterImpl))
{
}
public class TokenFilterImpl : IAsyncActionFilter
{
public ItemExistsFilterImpl()
{
}
public async Task OnActionExecutionAsync(
ActionExecutingContext context, ActionExecutionDelegate next)
{
// Validate your headers here
//context.HttpContext.Request.Headers...
if (isNotValid)
{
context.Result = new NotFoundObjectResult($"Some reason");
return;
}
// Add the required object to be retrieved from the controller
context.HttpContext.Items.Add("xxyyzz", modelInstance);
await next();
}
}
}
[HttpGet()]
// Decorate with your filterAttribute
[Token]
public async Task<IActionResult> GetAsync()
{
// retrive the modelInstance
var config = HttpContext.Items["xxyyzz"] as InstanceObjectClass;
return Ok();
}
我建议使用解析JWT的众多现有身份验证提供程序中的一个。如果您想继续使用asp核心身份验证概念,则需要调整您的流程。如果我们讨论的是其他方法,那么您可以创建一个helper方法/服务/共享基本控制器类或扩展方法。对于所有其他选项,更多的上下文将有所帮助。最佳解决方案是让身份验证中间件处理身份验证。ASP.NET Core通过Microsoft.AspNetCore.Authentication.JwtBearer包我在逐步注册向导中将令牌用作临时信息存储,因此我认为不应在那里使用授权引擎。@VladimirZotov这不是JWT令牌的用途。此外,您确实需要该中间件来联系颁发者并解密令牌。令牌中的任何声明都可以作为声明访问。链接文章展示了如何使用自定义office元素,该元素通过context.User.FindFirstc=>c.Issuer==http://localhost:5000/ &&c.Type==office.Value