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

时间:2018-04-13 09:18:56

标签: owin identityserver3 owin-middleware

是否可以将自定义参数发送到外部登录提供程序/自定义owin中间件

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

我尝试了以下方法:

  1. acr_values :我将令牌作为acr_value发送,但这种方法不起作用有两个原因:
    即使将InputLengthRestrictions的{​​{1}}设置为AcrValues中的51200,该令牌也会很长(> 900个字符。) acr_values存储在登录消息中,IdentityServerOptions - 方法和ApplyResponseChallengeAsync() - 方法
  2. 都无法访问该消息
  3. QueryString参数:我添加了一个包含令牌的QueryString参数,这也不起作用,因为重定向到外部提供程序时不存储该参数
  4. 有没有办法以我可以将参数传输到外部IdProvider的方式存储参数? 和/或我可以在AuthenticateCoreAsync()ApplyResponseChallengeAsync()

    期间访问SignInMessage

1 个答案:

答案 0 :(得分:0)

IdentityServer3 Nuget Package中存在扩展方法:

Context.Environment.GetSignInMessage(string signinId)

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

在signInMessage中,您可以访问返回网址(包括重定向到身份提供程序时传递的 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);
    //...
}

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