我正在尝试将身份服务器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
答案 0 :(得分:1)
在调查了一些日志并仔细观察请求之后,我意识到AJAX请求的登录响应并没有在浏览器上设置身份验证cookie。
将抓取请求中的credentials
选项设置为'same-origin'
修复了问题
感谢stackoverflow回答:https://stackoverflow.com/a/39233628