是否可以将自定义参数发送到外部登录提供程序/自定义owin中间件
我有 Identity Server 3 来处理我的身份验证,我有一个外部身份提供商中间件来处理用户的登录, 要登录,我必须向中间件发送令牌,中间件用于进行身份验证。
我尝试了以下方法:
acr_values
:我将令牌作为acr_value发送,但这种方法不起作用有两个原因:InputLengthRestrictions
的{{1}}设置为AcrValues
中的51200,该令牌也会很长(> 900个字符。)
acr_values存储在登录消息中,IdentityServerOptions
- 方法和ApplyResponseChallengeAsync()
- 方法有没有办法以我可以将参数传输到外部IdProvider的方式存储参数?
和/或我可以在AuthenticateCoreAsync()
或ApplyResponseChallengeAsync()
?
答案 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