跨重定向管理会话状态
Manage session state across redirects
我有一个 AngularJS 单页应用程序,它与用于授权/身份验证的 IdentityServer3 SSO 服务以及提供对数据和业务逻辑的访问的 .NET Core WebApi 服务层一起使用。
正常情况下,用户登录后,应用程序会重定向到网页主页。但是,在某些情况下,我需要应用到 return 到不同的 url。根据开发人员的说法,IdentityServer3 cannot do this,因此该要求必须由应用程序处理。他们建议使用会话存储来持久化重定向 url,从应用程序将用户带到 SSO 站点进行身份验证之前,直到它 returns,它应该检索存储的 url 并重定向用户。
考虑到这一点,我编写了一个 WebApi 控制器来持久化 url:
[Route("api/[controller]")]
public class RedirectController : Controller
{
private const string _redirectKey = "RedirectUrl";
// GET: api/redirect
[HttpGet]
public string Get()
{
return HttpContext.Session.GetString(_redirectKey);
}
// POST api/redirect
[HttpPost()]
public void Post([FromBody]string url)
{
HttpContext.Session.SetString(_redirectKey, url);
}
// DELETE api/redirect/
[HttpDelete()]
public void Delete()
{
HttpContext.Session.Remove(_redirectKey);
}
}
SPA 中用于设置和检索 url:
的方法
//to initiate authorisation
$scope.logIn = function () {
var url = $config.webRoot + "/#/myurl";
redirectService.setRedirectUrl(url).then(function (success) {
if (success) {
authorisationService.authorise();
}
});
};
//after authorisation
authorisationService.processTokenCallbackAsync(hash).then(function () {
//$log.info(authorisationService.accessToken());
//check if the app has set a redirect url for this session
redirectService.getRedirectUrl().then(function (url) {
$window.location.href = url || $config.webRoot + "/#/";
});
}, function (error) {
$log.error(error && error.message || error);
});
但是,当应用程序导航到 SSO 站点时,会话结束。当它回来时,SessionID 是不同的。是否有可能使会话状态在 SSO 重定向中保持不变,如果可以,我该怎么做?
我认为您误解了 Brock Allen 在您提供的 GitHub 问题的回复中的意思。
我认为他指的是 browser session storage 而不是某种服务器端会话。
服务器端会话破坏了 RESTful API 的目的,我看不出使用它们有任何优势。
会话存储完全在客户端,让您可以存储信息直到浏览器关闭(或 会话 结束):
sessionStorage.setItem('key', 'value');
并通过以下方式检索:
sessionStorage.getItem('key');
我有一个 AngularJS 单页应用程序,它与用于授权/身份验证的 IdentityServer3 SSO 服务以及提供对数据和业务逻辑的访问的 .NET Core WebApi 服务层一起使用。
正常情况下,用户登录后,应用程序会重定向到网页主页。但是,在某些情况下,我需要应用到 return 到不同的 url。根据开发人员的说法,IdentityServer3 cannot do this,因此该要求必须由应用程序处理。他们建议使用会话存储来持久化重定向 url,从应用程序将用户带到 SSO 站点进行身份验证之前,直到它 returns,它应该检索存储的 url 并重定向用户。
考虑到这一点,我编写了一个 WebApi 控制器来持久化 url:
[Route("api/[controller]")]
public class RedirectController : Controller
{
private const string _redirectKey = "RedirectUrl";
// GET: api/redirect
[HttpGet]
public string Get()
{
return HttpContext.Session.GetString(_redirectKey);
}
// POST api/redirect
[HttpPost()]
public void Post([FromBody]string url)
{
HttpContext.Session.SetString(_redirectKey, url);
}
// DELETE api/redirect/
[HttpDelete()]
public void Delete()
{
HttpContext.Session.Remove(_redirectKey);
}
}
SPA 中用于设置和检索 url:
的方法//to initiate authorisation
$scope.logIn = function () {
var url = $config.webRoot + "/#/myurl";
redirectService.setRedirectUrl(url).then(function (success) {
if (success) {
authorisationService.authorise();
}
});
};
//after authorisation
authorisationService.processTokenCallbackAsync(hash).then(function () {
//$log.info(authorisationService.accessToken());
//check if the app has set a redirect url for this session
redirectService.getRedirectUrl().then(function (url) {
$window.location.href = url || $config.webRoot + "/#/";
});
}, function (error) {
$log.error(error && error.message || error);
});
但是,当应用程序导航到 SSO 站点时,会话结束。当它回来时,SessionID 是不同的。是否有可能使会话状态在 SSO 重定向中保持不变,如果可以,我该怎么做?
我认为您误解了 Brock Allen 在您提供的 GitHub 问题的回复中的意思。
我认为他指的是 browser session storage 而不是某种服务器端会话。
服务器端会话破坏了 RESTful API 的目的,我看不出使用它们有任何优势。
会话存储完全在客户端,让您可以存储信息直到浏览器关闭(或 会话 结束):
sessionStorage.setItem('key', 'value');
并通过以下方式检索:
sessionStorage.getItem('key');