跨重定向管理会话状态

时间:2016-05-24 16:12:47

标签: angularjs asp.net-web-api asp.net-core single-sign-on session-state

我有一个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重定向中持续存在,如果是,我该如何做?

1 个答案:

答案 0 :(得分:1)

我相信你在你提供的GitHub问题的回复中误解了Brock Allen的意思。

我认为他指的是browser session storage而不是某种服务器端会话。

服务器端会话打破了RESTful API的目的,我认为使用它们没有任何优势。

会话存储完全是客户端存储,并允许您存储信息,直到浏览器关闭(或会话结束):

sessionStorage.setItem('key', 'value');

并以:

重审
sessionStorage.getItem('key');