jquery - 通过 Ajax 启动 session

标签 jquery ajax asp.net-mvc session asp.net-web-api

我为我的公司开发了一个基于 ASP.NET MVC 4 的数据监控门户(我将其称为门户 A)。我们与另一家公司达成协议(protocol),将该数据监控门户与该公司自己的在线门户(例如门户 B)集成。

现在他们想要使用门户 A 的一些用户界面,这将节省他们在门户 B 中开发自己的 UI 的时间。这两个门户与我的门户(门户 A)中集成的 WebApi 进行交互,该 WebApi 提供所需的数据到门户B。除了管理员的登录凭据之外,门户A和门户B拥有自己独立的数据。两个数据库都包含另一个数据库的精确副本。

门户 A 和门户 B 都在 session 范围内使用变量。问题是;假设用户登录到门户 B,现在我想使用通过 Ajax 通过门户 B 的凭据在门户 A 中创建一个 session ,这样用户就不必再次登录到门户 A。我通过 WebApi/Ajax 进行了尝试。

我在门户 A 中创建了一个 API 就是为了这个目的:

[RoutePrefix("monitoring/auth")]
public class UserCheckController : ApiController
{
    [EnableCors("*", "*", "*")]
    [Route("login/{username}/{password}/{token}")]
    [System.Web.Http.HttpGet]
    public User UserLogin(string username, string password, string token)
    {
        User login = new User();
        login.UserName = username;
        login.Password = password;

        if (ValidateUser(login, token) == true)
        {
             HttpContext.Current.Session[SessionName.UserObject] = login;
             HttpContext.Current.Session[SessionName.CurrentToken] = token;
             return login;
        }


        return null;
    }
}

我调用这个api的jQuery代码如下:

$.ajax({
      url: 'http://localhost:4004/monitoring/auth/login/Scott/tiger/THISISATOKEN',
      type: 'GET',
      contentType: 'application/json',
      success: function (data) {
              console.log("Login successfull");
              console.log(data);
          }


        });

当我通过 Ajax 调用 api 时,我在 Debug模式下看到变量被分配给 session ,并且我在控制台中获取数据对象 JSON。

我在同一个 API 中有另一个函数,它检查用户是否存在,代码如下:

[EnableCors("*", "*", "*")]
[Route("isalive/{userId}/{username}/{token}")]
[System.Web.Http.HttpGet]
public bool IsAlive(int userId, string username, string token )
{
    User user = HttpContext.Current.Session[SessionName.UserObject] as User;
    string _token = HttpContext.Current.Session[SessionName.CurrentToken].ToString();
    if (user == null)
    {
        return false;
    }
    return (id == user.UserId&& user.UserName.Equals(username) && _token.Equals(token));
 }

jQuery:

$.ajax({
      url: 'http://localhost:4004/monitoring/auth/isalive/97/Scott/THISISATOKEN',
      type: 'GET',
      contentType: 'application/json',
      success: function (data) {
              console.log("Checking for Session");
              console.log(data);
          }


        });

结果为 false,因为用户为 null。 我无法访问之前ajax创建的 session 数据。有没有办法在 Portal A 中保留 AJAX/WebApi 和浏览器之间的 session 。

解决这个问题的最佳方法是什么?

最佳答案

听起来您正在谈论 single sign-on解决方案。这通常是通过 OAuth 之类的联合身份验证机制来实现的,其中用户通过服务进行身份验证,并作为返回获得不记名 token ,然后可以将该不记名 token 重播到颁发它的服务,以断言用户凭据的有效性。

在您描述的场景中,门户 B 会向客户端发出一个 token (可能是加密的用户名),以响应成功的登录尝试。然后,使用门户 B 的客户端会在对门户 A 的调用中提供该 token ,门户 A 随后会通过服务器到服务器的调用将该 token 提供给门户 B,以测试 token 的有效性,并开始经过身份验证的 session 。

我应该补充一点,现实世界的 OAuth 实现比此处描述的要复杂一些,并且存在许多相关的安全问题。

关于jquery - 通过 Ajax 启动 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26378817/

相关文章:

asp.net-mvc - 需要帮助在我的 mvc3 项目中对我的服务层进行单元测试

jQuery 最接近排除自身

jquery - Yii2:验证屏蔽输入

jquery - D3.js 缩放初始缩放级别

jQuery AJAX 队列优先级

c# - 包含 Microsoft.Web.Mvc dll 后,Html.RenderAction 不可用

Jquery 选择关注页面加载(onLoad?)

php - 用于所有机场位置的 Skyscanner API 和使用 CURL 的 Travel API

基于浏览器的游戏的 AJAX 与 ActiveX/Flash

javascript - 使用 Kendo 获取和设置属性,可在更改事件上排序