将自定义参数发送到外部身份提供者

Send a custom parameter to an external identity provider

是否可以将自定义参数发送到外部登录 provider/custom owin 中间件

我有一个 Identity Server 3 来处理我的身份验证,我有一个外部身份提供者中间件来处理用户的登录, 要登录,我必须向中间件发送一个 令牌,中间件使用它来进行身份验证。

我尝试了以下方法:

  1. acr_values:我将令牌作为 acr_value 发送,但这种方法不起作用有两个原因:
    令牌太长(>900 个字符,即使在将 AcrValuesInputLengthRestrictions 设置为 IdentityServerOptions 中的 51200 之后也是如此。
    acr_values 存储在登录消息中,在 ApplyResponseChallengeAsync()-Method 和 AuthenticateCoreAsync()-Method
  2. 中都无法访问
  3. QueryString 参数:我添加了一个包含令牌的 QueryString 参数,这也不起作用,因为在重定向到外部提供程序时未存储该参数

有什么方法可以将参数存储到外部 IdProvider 中吗? and/or 我可以在 ApplyResponseChallengeAsync()AuthenticateCoreAsync() 期间访问 SignInMessage 吗?

IdentityServer3 Nuget 包中存在一个扩展方法:

Context.Environment.GetSignInMessage(string signinId)

这可以用在 ApplyResponseChallengeAsync() 方法中,因为登录 ID 是作为 queryString-参数

传递的

并且在 signInMessage 中,您可以访问 return url(包括重定向到身份提供者时传递的 QueryString 参数)和 acr_values,等等。

因此您只需从查询中获取 signin 值并调用 GetSignInMessage()

protected override Task ApplyResponseChallengeAsync()
{   
    //...
    string signInId = null;
    IReadableStringCollection query = Request.Query;
    var values = query.GetValues("signin");
    if(values!= null && values.Count == 1)
    {
        signInId = values[0];
    }
    if (signInId == null)
        return Task.FromResult<object>(null);

    var signInMessage = Context.Environment.GetSignInMessage(signInId);
    //...
}

毕竟这很容易,但很难找到,因为几乎没有研究 material,除了这个 github 问题(这基本上是这个答案的来源) :
Custom values to external provider #1318