带有SPA前端的IdentityServer4主机

时间:2018-03-02 02:11:03

标签: asp.net-core single-page-application identityserver4

我正在尝试将身份服务器4用作SSO站点,并将前端写为SPA(框架并不重要)

示例项目使用MVC,当用户登录页面时,会将文件发布到将浏览器重定向到返回URL的控制器。

我无法修改此流程以更加AJAX的方式工作。首先,我希望能够将用户名/密码提交给API控制器,以便我可以在不进行页面刷新的情况下获取验证错误等。鉴于登录成功,我需要将浏览器重定向到returnUrl,但我无法使其工作,并且回调网址会再次将用户返回到登录页面,而不是重定向到登录的客户端应用程序。

这就是我的登录端点:

[HttpPost]
[Route("api/identity/login")]
public async Task<IActionResult> Login(LoginInputModel model)
{
    // check credentials in model etc
    await _eventsService.RaiseAsync(new UserLoginSuccessEvent(model.Email, subjectId, model.Email));
    await HttpContext.SignInAsync(subjectId, model.Email, new AuthenticationProperties());
    return Ok();
}

作为前端的简单形式,它托管在静态html页面上:

<form>
    <label for="email">Email</label>
    <input id="email" type="email" />

    <label for="password">Password</label>
    <input id="password" type="password" />

    <button onclick="login()" type="submit">Log me in</button>
</form>
<script>
    var email = document.querySelector('#email').value;
    var password = document.querySelector('#password').value;
    var returnUrl = unescape(window.location.search.replace('?returnUrl=', ''));
    fetch('/api/identity/login', {
            body: JSON.stringify({ email, password }),
            headers: new Headers({
                'Content-Type': 'application/json'
            }),
            method: 'POST'
    }).then(() => {
        var returnUrl = unescape(window.location.search.replace('?returnUrl=', ''));
        window.location = window.location.origin + returnUrl;
    })
</script>

在200响应中,我使用javascript将浏览器重定向到returnUrl。

我不确定我缺少什么才能让它发挥作用。我是否需要在一次通话中对用户进行签名并重定向?

我正在修改现有的示例应用程序,它可以按预期使用直接发布/重定向方法,因此主机和客户端配置都保持不变:https://github.com/BenjaminAbt/Samples.AspNetCore-IdentityServer4

1 个答案:

答案 0 :(得分:1)

在调查了一些日志并仔细观察请求之后,我意识到AJAX请求的登录响应并没有在浏览器上设置身份验证cookie。

将抓取请求中的credentials选项设置为'same-origin'修复了问题

感谢stackoverflow回答:https://stackoverflow.com/a/39233628