我为我的公司开发了一个基于 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/