将自定义参数发送到外部身份提供者
Send a custom parameter to an external identity provider
是否可以将自定义参数发送到外部登录 provider/custom owin 中间件
我有一个 Identity Server 3 来处理我的身份验证,我有一个外部身份提供者中间件来处理用户的登录,
要登录,我必须向中间件发送一个 令牌,中间件使用它来进行身份验证。
我尝试了以下方法:
acr_values
:我将令牌作为 acr_value 发送,但这种方法不起作用有两个原因:
令牌太长(>900 个字符,即使在将 AcrValues
的 InputLengthRestrictions
设置为 IdentityServerOptions
中的 51200 之后也是如此。
acr_values 存储在登录消息中,在 ApplyResponseChallengeAsync()
-Method 和 AuthenticateCoreAsync()
-Method 中都无法访问
- 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
是否可以将自定义参数发送到外部登录 provider/custom owin 中间件
我有一个 Identity Server 3 来处理我的身份验证,我有一个外部身份提供者中间件来处理用户的登录, 要登录,我必须向中间件发送一个 令牌,中间件使用它来进行身份验证。
我尝试了以下方法:
acr_values
:我将令牌作为 acr_value 发送,但这种方法不起作用有两个原因:
令牌太长(>900 个字符,即使在将AcrValues
的InputLengthRestrictions
设置为IdentityServerOptions
中的 51200 之后也是如此。
acr_values 存储在登录消息中,在ApplyResponseChallengeAsync()
-Method 和AuthenticateCoreAsync()
-Method 中都无法访问
- 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