我的任务是为客户创建面向服务的生态系统。整个过程将基于REST,并在ASP.NET中构建,但是我的问题与技术无关。我们希望有一个集中的身份验证服务,该服务颁发JWT令牌和环境中其他服务信任的声明。
我的问题是-网络客户端(浏览器)要求的第一件事是什么?我看过的所有图表(我将尝试添加几个示例链接)使客户端似乎需要自我意识,并意识到在进行第一个操作之前,客户端将需要令牌。向功能性REST服务的请求,对我来说似乎很麻烦。
我希望它的工作方式是它们只是尝试访问受保护的资源,但是在我的REST服务的请求中没有身份验证令牌,要求用户向他们挑战用户名/密码,然后将身份验证委托给我的身份验证服务。所以:
浏览器请求REST服务上的受限资源
REST服务返回401
浏览器收集凭据,发送到相同的Web服务
REST服务连接到身份验证服务,并传递来自客户端请求的Auth标头
Auth服务创建JWT令牌并将其返回给REST服务
REST服务验证JWT并将Auth标头替换为JWT令牌
JWT令牌将保留用于后续请求,直到expy设置
...我对此完全不满意吗? Web客户端是否需要知道有一个单独的身份验证服务,并在其中提出一个请求以获取其JWT,然后再向另一个请求传递通过JWT的REST资源?在我看来这很笨拙,我希望这不是主意。
另外,还有一个n00b问题-JWT令牌是否由Web客户端自动保留并随每个请求重新发送,因此我不必每次都经过auth服务步骤?那是到期设置的目的吗?
TIA。
有关我的意思的示例,请参见此处的图1:http://msdn.microsoft.com/en-us/library/hh446531.aspx
最佳答案
从您的最后一个问题开始,将使其余答案更加清晰:
“ ...是Web客户端自动保留的JWT令牌,并随每个请求重新发送。”-想法是发出一次JWT,将其发送给客户端,以便客户端可以保存它并在以后的每个请求中发送。这样,您的前端应用程序将只发送一次用户名和密码,然后使用JWT进行身份验证。您将必须使用浏览器存储(本地或会话)或cookie(旧版浏览器的常见备用)来存储JWT。
“ ... Web客户端是否需要知道是否存在单独的身份验证服务...”-您需要将用户名和密码发送给服务,以便发出JWT。您可以只用一个请求来实现它,但是您需要将凭据发送到服务(由用户提供),接收JWT作为响应的一部分并存储它(如上所述)。根据需求和实现,在单独的请求上执行此操作可能会更容易。