将Identityserver的“状态”参数设置为与呼叫相关的GUID?

时间:2019-05-30 10:30:38

标签: authentication asp.net-core identityserver4 openid-connect identityserver3

我希望关联整个 Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectEvents 中的所有调用(OnRedirectToIdentityProvider,OnAuthorizationCodeReceived等)。

我希望在 OnRedirectToIdentityProvider 中将' state '参数设置为GUID,以便以后在日志中关联调用,例如

 OnRedirectToIdentityProvider = async context =>
 {
    var myGuid = Guid.NewGuid().ToString();
    context.ProtocolMessage.State = myGuid;
    _log.LogInformation("OnRedirectToIdentityProvider: {0}", myGuid);

  ...
 },
 OnAuthorizationCodeReceived = async context =>
 {
     _log.LogInformation("OnAuthorizationCodeReceived: {0}", context.ProtocolMessage.State);

  ...
 },
...

在文档中,据说IdentityServer将回显令牌响应上的状态值。 http://docs.identityserver.io/en/latest/endpoints/authorize.html

我还读到客户端负责验证此属性。

问题是:

  • 我找不到何时要使用' state '属性的任何特定资源,验证是由中间件自动处理还是由我处理我自己使用的是回调函数

  • 在“状态”参数中使用GUID时应该考虑任何安全风险吗?

  • 我应该考虑的
  • 优点/缺点

关于, A

1 个答案:

答案 0 :(得分:0)

这是将 GUID用作ProtocolMessage.State 属性值的有效方法。

在OnRedirectToIdentityProvider事件中设置ProtocolMessage.State之后

context.ProtocolMessage.State = myGuid;

从源代码中发现,正在使用StateDataFormat.Unprotect()方法对数据进行反序列化。我用它来调试

context.Options.StateDataFormat.Unprotect("CfDJ8...yr7Rpx3DyQMwPw")
查询中的

' state '值实际上是序列化的AuthenticationProperties类。

AuthenticationProperties类由中间件生成,并且ProtocolMessage。状态值实际上存储为响应中的 AuthenticationProperties.Items [“ OpenIdConnect.Userstate”] 。 如评论中所述,中间件负责状态验证。