我有与后端 API 通信的 SPA (angular.js)。我想要实现的是 OpenId Connect 的混合流,它将为 API(登录用户)发布身份令牌并为 SPA 设置角色。
我是根据这个示例做的 - https://github.com/IdentityServer/IdentityServer4.Samples/tree/dev/Mvc/src/IdSvrHost
如果我将 [Authorize] 属性放在某个控制器上并尝试访问它,这一切都很好 - 我被重定向到登录屏幕并可以登录。我正在使用 AspNet OpenId Connect 中间件来登录用户并访问他的声明。
问题是我想要一个简单的登录屏幕,在成为未经授权的用户后没有重定向(即第一次用户进入应用程序并单击“登录”按钮)。
我无法理解的是(来自上面提到的示例 LoginController.cs):
[HttpGet(Constants.RoutePaths.Login, Name = "Login")]
public async Task<IActionResult> Index(string id)
{
var vm = new LoginViewModel();
if (id != null)
{
var request = await _signInInteraction.GetRequestAsync(id);
if (request != null)
{
vm.Username = request.LoginHint;
vm.SignInId = id;
}
}
return View(vm);
}
登录屏幕获取此 SignInId cookie 和 id(在未经授权的重定向期间),稍后将在实际登录期间使用(用于 SignInResult)。
1) 混合流是否最适合与后端 API 一起使用的 SPA?这里的客户端和身份服务器都是我们的,因此它们是值得信赖的。
2)如果不需要SignInId,那么用空白登录表单实现混合流的方法是什么?
3)如果 SignInId 是必要的,那么让空白登录屏幕和使用这种方法的工作流程是什么?遗憾的是,使用 [Authorize] 重定向是我现在看到的唯一选择
4) 这种方法(OpenId Connect 的混合流程)可以很好地与移动应用程序一起使用吗?(考虑 cookie、存储等)
5) 目前 Identity Server 在另一个项目中(在我的 API 旁边)——如果 API 和 Identity Server 都在同一个项目中(自托管)或者这不会影响任何事情,会有什么变化吗?@kapoc
写预览