我有一个AngularJS单页面应用程序,它使用IdentityServer3 SSO服务进行授权/身份验证,以及一个.NET Core WebApi服务层,可以访问数据和业务逻辑。
通常,在用户登录后,应用程序会重定向到Web主页。但是,在某些情况下,我需要应用程序返回到不同的URL。根据开发人员IdentityServer3 cannot do this,因此必须由应用程序处理该要求。他们建议使用会话存储来保存重定向URL,然后应用程序将用户带到SSO站点进行身份验证,直到它返回,它应该检索存储的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中的和方法来设置和检索网址:
//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重定向中持续存在,如果是,我该如何做?
答案 0 :(得分:1)
我相信你在你提供的GitHub问题的回复中误解了Brock Allen的意思。
我认为他指的是browser session storage而不是某种服务器端会话。
服务器端会话打破了RESTful API的目的,我认为使用它们没有任何优势。
会话存储完全是客户端存储,并允许您存储信息,直到浏览器关闭(或会话结束):
sessionStorage.setItem('key', 'value');
并以:
重审sessionStorage.getItem('key');