自定义标头中ID为的ASP.NET MVC会话

本文关键字:ASP NET MVC 会话 为的 ID 自定义 | 更新日期: 2023-09-27 17:59:50

在ASP.NET MVC中(无需编写太多代码)是否可以手动选择当前会话ID?我不是想创建自己的sessionId,而是想将sessionId存储在自定义标头中,而不是cookie或url中。我不介意我是否需要自己阅读标题,并在requestrongtart:中做这样的事情

Request.Session = new SessionState(Request.Headers["sessionId"]);

主要的是,我不想将会话状态存储在cookie中(因为cookie不会在本应与mvc应用程序对话的设备上启用),我也不想在客户端上解析url,然后重新发送插入到url中的sessionId的所有内容。

此外,如果我不能用本机会话对象做到这一点,我也不介意,我只需要一个快速简单的解决方案,在自定义标头中使用令牌,而不是cookie。

自定义标头中ID为的ASP.NET MVC会话

我知道你提到不想解析url,但使用带有路由的url似乎是一个简单快速的解决方案,请将参数添加到您的路由中:

在您的Global.asax 中

routes.MapRoute(
  "SessionIdUrl",
  "{sessionId}/{controller}/{action}/{id}",
  new { controller = "Home", action = "Index", id = "" }
);

创建一个基本控制器并使SessionId可用于您的控制器:

public class BaseController : Controller
{
  public string UrlSessionId { get; set; }
  protected override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    base.OnActionExecuting(filterContext);
    object sessionId = "";
    if (filterContext.RouteData.Values.TryGetValue("sessionId", out sessionId))
    {
      UrlSessionId = sessionId.ToString();
    }
  }
}

在您的控制器上继承自此基本控制器:

public class HomeController : BaseController

所以你的控制器可以访问基地。UrlSessionId。

用户登录后,开始使用Url中的sessionId;

[HttpPost]
public ActionResult SignIn(User data)
{
  // authenticate
  return RedirectToAction("AfterSignedIn", new { sessionId = Session.SessionID, id = "my id" } );
}

在您的视图上,创建与SessionId的链接,如下所示:

@Html.ActionLink("My link", "ActionWithUrlSession", "YourController", new { sessionId = Session.SessionID, id = "my id" }, null)

在这里,你实际上可以使用Session.SessionID之外的任何其他东西,你可能更擅长识别当前登录用户。