Jquery 通过Ajax启动会话
我为我的公司开发了一个基于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,仅用于此目的: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都使用会话范围中的变量。问题是,;假设一个用户登
[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请求传递普通密码是一个非常糟糕的主意。你应该把它改成一个帖子