C# ASP.NET核心:将信息从标头传递到控制器的最佳方式是什么

C# ASP.NET核心:将信息从标头传递到控制器的最佳方式是什么,c#,asp.net-core,C#,Asp.net Core,我有一个ASP.NET核心控制器,有几个方法需要在头中传递特定数据。需要澄清的是,数据是包含一些会话信息的JWT令牌。要检索存储在令牌中的信息,我需要执行一些操作: 如果未返回错误请求,则检查标头是否存在 将jwt令牌解码为json字符串 将json字符串映射到模型实例 目前,我在控制器方法中执行所有这些步骤,但这是一种糟糕的做法,因为这是代码复制。我在考虑一些优雅的解决方案,比如创建一个自定义属性并用它装饰方法。但我找不到将数据从属性传递到控制器操作的方法。在我看来,属性是为另一类任务设计的

我有一个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