【问题标题】:How to set and return session id in headers in web api2如何在 web api2 的标头中设置和返回会话 ID
【发布时间】:2017-06-10 06:55:33
【问题描述】:

成功登录后,我想在响应标头中返回session_id,以及我想返回的一些对象。

我的典型响应头如下。

Response
Header: Set-cookie: session_id=121212-343dsfsd-4323132, path=/, expires: 1212
Body: {
    “status”: 0,
    “data”: {
        “userRole”: “SUPER_ADMIN”
    }
}

我正在尝试如下实现上述目标。

bool result = //...validate username and password with database

if(result == true)
{
    SessionIDManager manager = new SessionIDManager();
    string newSessionId= manager.CreateSessionID(HttpContext.Current);
    var resp = new HttpResponseMessage();
    var cookie = new CookieHeaderValue("session-id",newSessionId);
    cookie.Expires = DateTimeOffset.Now.AddDays(1);
    cookie.Domain = Request.RequestUri.Host;
    cookie.Path = "/";
    resp.Headers.AddCookies(new CookieHeaderValue[] { cookie });
    //return resp;
    obj.UserRole = (from c in entityObject.NCT_UserRegistration where obj.User_Name == c.User_Name && obj.User_Password == c.User_Password select c.User_Role).FirstOrDefault();
    obj.Success = 0;
    obj.User_Password="";
    return Ok(obj);
}

我不确定我遵循的方式是否正确。我怎样才能像上面一样返回sessionid

【问题讨论】:

    标签: c# session cookies asp.net-mvc-5 asp.net-web-api2


    【解决方案1】:

    将上述代码重构如下

    if(result == true) {
    
        obj.UserRole = (from c in entityObject.NCT_UserRegistration where obj.User_Name == c.User_Name && obj.User_Password == c.User_Password select c.User_Role).FirstOrDefault();
        obj.Success = 0;
        obj.User_Password = "";
    
        var response = Request.CreateResponse(HttpStatusCode.OK, obj);
    
        var newSessionId = new SessionIDManager().CreateSessionID(HttpContext.Current);
        var cookie = new CookieHeaderValue("session-id", newSessionId);
        cookie.Expires = DateTimeOffset.Now.AddDays(1);
        cookie.Domain = Request.RequestUri.Host;
        cookie.Path = "/";
    
        response.Headers.AddCookies(new[] { cookie });
    
        return ResponseMessage(response);
    }
    

    主要区别在于响应的创建和返回方式。原始代码是手动创建一个新的响应,用 cookie 填充它,然后返回另一个完全不同的响应,它的主体减去 cookie。即:Ok(obj).

    上面的代码创建了一个包含要返回的对象值的响应,然后将cookie头信息添​​加到响应中。

    如果 OP 的初衷是返回IHttpActionResult,那么ResponseMessage(response) 会将HttpResponseMessage 包装在IHttpActionResult 派生实现中。

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 2017-06-16
      • 2023-03-18
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 2016-12-11
      相关资源
      最近更新 更多