Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 通过Ajax启动会话_Jquery_Ajax_Asp.net Mvc_Session_Asp.net Web Api - Fatal编程技术网

Jquery 通过Ajax启动会话

Jquery 通过Ajax启动会话,jquery,ajax,asp.net-mvc,session,asp.net-web-api,Jquery,Ajax,Asp.net Mvc,Session,Asp.net Web Api,我为我的公司开发了一个基于ASP.NET MVC 4的数据监控门户,我将其称为门户a。我们与另一家公司达成协议,将该数据监控门户与该公司自己的在线门户(如门户B)集成 现在,他们希望使用门户A的一些用户界面,这将节省他们在门户B中开发自己的UI的时间。这两个门户与集成在我的门户A中的WebApi交互,该WebApi向门户B提供所需的数据。门户A和门户B除了管理员的登录凭据外,还有自己的独立数据。两个数据库都包含另一个数据库的精确副本 门户A和门户B都使用会话范围中的变量。问题是,;假设一个用户登

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

现在,他们希望使用门户A的一些用户界面,这将节省他们在门户B中开发自己的UI的时间。这两个门户与集成在我的门户A中的WebApi交互,该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;
    }
}
我调用此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时,我在调试模式下看到变量被分配给会话,我在控制台中得到了数据对象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和浏览器之间的门户中保留会话


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

为了确保可以访问会话变量,必须在调用的文件中声明会话开始,并且文件会触发此问题。听起来您在谈论解决方案。这通常是通过像OAuth这样的联合身份验证机制来实现的,其中用户使用服务进行身份验证,作为回报,提供一个承载令牌,然后可以将该承载令牌重放到发布它的服务,以断言用户凭证的有效性

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


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

门户a和门户B设计在同一个域上吗?或者至少在同一个超级域上,比如A.domain.com和B.domain.com?假设A位于哪个门户网站上,它向哪个门户网站发送ajax请求假设B?我想指出,通过GET请求传递普通密码是一个非常糟糕的主意。你应该把它改成一个帖子