我为我的公司开发了一个在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()必须在被调用的文件中声明,并且该文件触发