【问题标题】:Pass username into headers using httpContext asp.net core mvc使用 httpContext asp.net core mvc 将用户名传递到标头
【发布时间】:2021-10-14 09:48:16
【问题描述】:

我想将一个变量传递到我的中间件的标头中。在我的控制器中,我使用username 来保存在视图中输入的值。然后我在想如果我使用TempData 我可以将username 的值传递给我的中间件类并将其添加到标题中。我注意到在它最终进入 if 语句 ( if (tempData.ContainsKey("username"))) 并添加标题之后。当我进入下一页时,它会返回中间件......它不会进入 if 语句并继续下一行 correlationId = Guid.NewGuid().ToString();`。这是在中间件中传递变量并将其添加到标头中的正确方法吗?

控制器:

  [HttpPost]
    public IActionResult AddressValidate(IFormCollection form)
    {
        // if radio button was checked, perform the following var request.

        // username

        string username = form["UserName"];
        TempData["username"] = username;
        TempData.Keep();

        string status = form["Status"];

        _logger.LogInformation("Current user logged in: {@Username}", username);
 
      ......

   return RedirectToAction("SecondIndex", "Second")         
}

Middleware:

  public class CorrelationIdMiddleware
    {
        private readonly ITempDataDictionaryFactory _tempDataDictionaryFactory;
        private const string CorrelationIdHeaderKey = "X-Correlation-ID";
        private readonly RequestDelegate _next;
        private readonly ILogger _logger;
        public CorrelationIdMiddleware(RequestDelegate next, ILoggerFactory loggerFactory, ITempDataDictionaryFactory tempDataDictionaryFactory)
        {
            _next = next ?? throw new ArgumentNullException(nameof(next));
            _logger = loggerFactory.CreateLogger<CorrelationIdMiddleware>();
            _tempDataDictionaryFactory = tempDataDictionaryFactory;
        }
        public async Task Invoke(HttpContext httpContext)
        {
            string correlationId = null;
            string userName;

            var tempData = _tempDataDictionaryFactory.GetTempData(httpContext);

  
            if (httpContext.Request.Headers.TryGetValue(
            CorrelationIdHeaderKey, out StringValues correlationIds))
            {
                correlationId = correlationIds.FirstOrDefault(k =>
                k.Equals(CorrelationIdHeaderKey));
                _logger.LogInformation("CorrelationId from Request Header: {@correlationId} ", correlationId);
            }
            else
            {
                if (tempData.ContainsKey("username"))
                {
                    userName = tempData["username"].ToString();
                    httpContext.Request.Headers.Add("X-username", userName);
                }

                correlationId = Guid.NewGuid().ToString();
                httpContext.Request.Headers.Add(CorrelationIdHeaderKey,
                correlationId);
                _logger.LogInformation("Generated CorrelationId: {@correlationId}", correlationId);
            }
            httpContext.Response.OnStarting(() =>
            {
                if (!httpContext.Response.Headers.
                TryGetValue(CorrelationIdHeaderKey,
                out correlationIds))
                    httpContext.Response.Headers.Add(
                    CorrelationIdHeaderKey, correlationId);
                return Task.CompletedTask;
            });
            await _next.Invoke(httpContext);
        }
    }

像这样的会话?

【问题讨论】:

  • “正确”仅取决于您的情况。如果这可行并满足您的需求,那么它可能就足够正确了。
  • @DavidL 我明白了,但这是它应该表现的方式吗?就像它首先将用户名添加到标题中一样,然后重定向到下一页,它不会输入 if 语句来添加标题。这是它应该表现的方式吗?抱歉,我是中间件流程的新手
  • 您是否调试过您的 if 语句,检查 headers 集合是否符合您的预期?
  • 我在调试httpContext.Request.Headers时没有看到标题集合,是不是在其他地方?

标签: c# asp.net-mvc asp.net-core-mvc middleware tempdata


【解决方案1】:

您应该将您写入的逻辑代码写入 httpContext.Response.OnStarting 的标头中。它对我有用。

【讨论】:

  • 谢谢!每当我这样做时,我注意到无论应用程序是否结束,它都会抓取在文本框中输入的先前用户名。因此,当应用程序第一次启动并点击索引页面时,它将输入if(tempData.ContainsKey("username")),因为没有输入用户名,所以它不应该输入。有没有办法在应用关闭时清除 tempData,这样它就可以从头开始,而不是使用上次输入的用户名?
  • @MarkCo 为什么你不使用 Session。我的意思是我们可以给用户名设置一个有效时间,下次认证过期就会被移除。
  • 会话如c-sharpcorner.com/UploadFile/ansh06031982/… ?请查看更新后的帖子,以便您可以在该链接中看到我正在谈论的部分
  • @MarkCo 感谢您的文档,我已经非常了解 Tempdata 的用法了。
  • @MarkCo 建议你在中间件中加入对时间敏感的参数,传递你想要的数据。
猜你喜欢
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
  • 2017-07-26
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多