跨重定向管理会话状态

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');