IdentityServer4-API服务器如何与Identity Server通信
我们目前正在通过IdentityServer4 github项目开发API和IdentityServer: Github存储库: 文件: 我们正在考虑API服务器或服务提供商(SP)与身份服务器或身份提供商(IdP)通信的最有效和安全的方式。我们还没有找到很多信息 该图向我们展示了: 服务提供商(SP)向身份提供商(IdP)请求用户信息(步骤5:用户信息检索) (来源:)IdentityServer4-API服务器如何与Identity Server通信,identityserver4,openid,Identityserver4,Openid,我们目前正在通过IdentityServer4 github项目开发API和IdentityServer: Github存储库: 文件: 我们正在考虑API服务器或服务提供商(SP)与身份服务器或身份提供商(IdP)通信的最有效和安全的方式。我们还没有找到很多信息 该图向我们展示了: 服务提供商(SP)向身份提供商(IdP)请求用户信息(步骤5:用户信息检索) (来源:) SP如何向IdP询问这些信息?例如,他是否发送包含用户发送的访问令牌的HTTP Post“令牌信息” 如果是,IdP如何理
- 在IdP和SP之间使用特定的SSL证书,并以某种方式对其进行验证
- RSA还使用IdP已知的证书对访问令牌的哈希进行签名
- 将SP本身注册为IdP的特定客户端和特定索赔
- 此声明仅提供给SP,并允许SP发送请求以询问有关访问令牌的用户信息
我们也可以提供代码,但我们认为这个问题主要是一个架构问题。该图显示了用户如何验证和获取访问令牌。SP在idP中注册(使用clientID/secret)。SP通过向浏览器发送重定向请求用户(浏览器)进行身份验证 SP稍后在获取身份验证代码时,会在后台发出单独的请求,以获取真正的访问/id令牌 执行此交换的一些简化代码如下所示:
/// <summary>
/// This method is called with the authorization code and state parameter
/// </summary>
/// <param name="code">authorization code generated by the authorization server. This code is relatively short-lived, typically lasting between 1 to 10 minutes depending on the OAuth service.</param>
/// <param name="state"></param>
/// <returns></returns>
[HttpPost]
public IActionResult Callback(string code, string state)
{
//To be secure then the state parameter should be compared to the state sent in the previous step
var url = new Url(_openIdSettings.token_endpoint);
var token = url.PostUrlEncodedAsync(new
{
client_id = "authcodeflowclient", //Id of this client
client_secret = "mysecret",
grant_type = "authorization_code",
code_verifier = code_verifier,
code = code,
redirect_uri = "https://localhost:5001/CodeFlow/callback"
}).ReceiveJson<Token>().Result;
return View(token);
}
//
///使用授权代码和状态参数调用此方法
///
///授权服务器生成的授权代码。此代码相对较短,通常持续1到10分钟,具体取决于OAuth服务。
///
///
[HttpPost]
公共IActionResult回调(字符串代码、字符串状态)
{
//为了安全起见,应将状态参数与上一步中发送的状态进行比较
var url=新url(_openIdSettings.token_endpoint);
var token=url.PostUrlEncodedAsync(新
{
client_id=“authcodeflowclient”,//此客户端的id
客户_secret=“mysecret”,
授予\ u type=“授权\ u代码”,
代码校验器=代码校验器,
代码=代码,
重定向_uri=”https://localhost:5001/CodeFlow/callback"
}).ReceiveJson().Result;
返回视图(令牌);
}
对于接收到的令牌,由客户端决定存储它们的位置。在ASP.NET中,ID令牌用于创建用户会话cookie,然后丢弃ID令牌。访问令牌也可以存储在此cookie中,也可以存储在内存或其他地方。但这一切都取决于你的需要
SP获得访问令牌后,可以将该令牌传递给API。但是,在API可以验证令牌的签名之前,它首先向IdP请求其公共签名密钥(GET请求),然后API使用它来验证令牌签名
有关令牌签名和密钥的详细信息,请参见此部分。您的问题涉及很多。所以,也许最好问一些更细致的问题,但我希望我的答案是一个起点:-)非常感谢你的回答。我的问题是关于“获取真实访问权/id令牌的单独请求”的。我们假设这种请求是SP向IdP隐式发出的,但我们对此不太确定。如果是这样,SP是否以某种方式将信息存储在内存中?再次感谢您的帮助,我们将继续学习!