通过Ajax启动会话



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

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

入口A和入口B都使用会话范围中的变量。问题是;假设用户登录到门户B,现在我想使用通过Ajax通过门户B的凭据在门户a中创建一个会话,这样用户就不必再次登录到门户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;
    }
}

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

$.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时,我在调试模式下看到变量被分配给会话,并且我在控制台中获得了数据对象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创建的会话数据。有没有一种方法可以在AJAX/WebApi和浏览器之间的Portal a中保留会话。

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

这听起来像是在谈论一个单点登录解决方案。这通常是通过像OAuth这样的联合身份验证机制来实现的,在该机制中,用户使用服务进行身份验证,并作为回报获得一个承载令牌,然后可以将该承载令牌重播给发布它的服务,以断言用户凭证的有效性。

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

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

为了确保会话变量可以被访问,session_start()必须在被调用的文件中声明,并且该文件触发

最新更新