- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我的 OpenIdConnectAuthenticationOptions
中,我设置了 OpenIdConnectAuthenticationNotifications
RedirectToIdentityProvider
看起来像这样:
RedirectToIdentityProvider = n =>
{
if (n.ProtocolMessage.RequestType == Microsoft.IdentityModel.Protocols.OpenIdConnectRequestType.AuthenticationRequest)
{
n.ProtocolMessage.LoginHint = "LoginHint";
n.ProtocolMessage.AcrValues = "idp:CustomIdProvider";
}
return Task.FromResult(0);
}
在此示例中,我能够收到 LoginHint,并且一切正常。
现在,如果我将 LoginHint
设置为大约 1000 个字符长的内容(AcrValues
也是如此),IdentityServer 显示一条错误消息:
There is an error determining which application you are signing into. Return to the application and try again.
日志显示此消息:
No cookie matching signin id found
只有当 LoginHint
(或 AcrValues
)达到一定大小时才会发生这种情况
存储cookie或读取cookie时似乎有问题也许他们太大了
Web Config(according to this answer 所有这些值都应该足够高,我会在它工作时将它们降低到适当的值):
<system.web>
<httpRuntime targetFramework="4.6.1" maxUrlLength="109990" maxQueryStringLength="100000" maxRequestLength="256000" />
</system.web>
<!--...-->
<requestFiltering>
<requestLimits maxQueryString="100000" maxAllowedContentLength="1073741824" />
</requestFiltering>
IdentityServerOptions
中的
InputLengthRestrictions(同样,值应该足够):
InputLengthRestrictions = new InputLengthRestrictions
{
UserName = 51200,
AcrValues = 51200,
LoginHint = 51200
}
这是这个问题的后续问题:Send a custom parameter to an external identity provider
编辑:
我的客户收到一个 token 作为查询参数,它可以很长(大约 900 个字符)。
客户端现在使用以下选项重定向到 IdentityServer:app.UseOpenIdConnectAuthentication(options);
客户端 Startup.cs:
RedirectToIdentityProvider = n =>
{
if (n.ProtocolMessage.RequestType == Microsoft.IdentityModel.Protocols.OpenIdConnectRequestType.AuthenticationRequest)
{
var token = n.Request.Query.Get("token");
if (token != null)
{
n.ProtocolMessage.Parameters.Add("token", token);
n.ProtocolMessage.AcrValues = "idp:CustomIdP";
}
}
return Task.FromResult(0);
}
其余的选项
都非常基本
在我的 IdentityServer 上,我配置了 AuthenticationOptions
' IdentityProviders
-属性,如您在我的 IdServer 配置的摘录中所见,我还设置了 InputLengthRestrictions
设置一个高值,只是为了安全起见:
IdentityServer Startup.cs:
IdentityServerOptions options = new IdentityServerOptions
{
InputLengthRestrictions = new InputLengthRestrictions
{
RedirectUri = 51200,
AcrValues = 51200,
LoginHint = 51200
},
AuthenticationOptions = new AuthenticationOptions {
CookieOptions = new IdentityServer3.Core.Configuration.CookieOptions
{
SessionStoreProvider = new SessionStoreProvider()
},
IdentityProviders = ConfigureIdentityProviders,
}
};
idsrvApp.UseIdentityServer(options);
然后我配置我的 IdentityProvider,我的 IdentityProvider 使用 Clients Startup.cs 中指定的参数中的 token 这适用于短 token ,一切都按应有的方式调用。
但是如果 token 太长,它甚至不会走那么远。我的猜测是问题的根源在于 OpenIdConnectAuthenticationHandler
显然我的 token 被添加到对 IdentityServer 的请求中两次。
由于这个原因,cookie 的限制很快就达到了。
客户端 Startup.cs:
RedirectToIdentityProvider = n =>
{
if (n.ProtocolMessage.RequestType == Microsoft.IdentityModel.Protocols.OpenIdConnectRequestType.AuthenticationRequest)
{
var token = n.Request.Query.Get("token");
if (token != null)
{
n.ProtocolMessage.Parameters.Add("token", token);
n.ProtocolMessage.AcrValues = "idp:CustomIdP";
}
}
return Task.FromResult(0);
}
在这里,我从 QueryString 中获取了 token。但我在这里错过的是,n.ProtocolMessage
已经包含 RequestUri
作为包含 token 的状态参数。因此 token 被发送到 IdentityServer 两次。如果我从 state
-Parameter 中删除 token (这是正确的做法,因为我不需要它重定向回来)并将其添加为 AcrValue
确实按预期将其发送到 IdentityServer。
但问题仍然存在。
最佳答案
我不能确定,但是,这听起来可能是最大 cookie 大小的问题。
Cookies在most browsers中只能存储4096字节, 例如,如果 cookie 以 UTF-32 格式存储,则 1024 个字符将是 take up all of that space并且您的 cookie 将被截断。
您可能想尝试覆盖 CookieOptions 之一AuthenticationOptions 中的属性.
在 CookieOptions
类中,您可以提供 IAuthenticationSessionStoreProvider .根据对该属性的评论,它可能是您正在寻找的解决方案,至少您可以调试出问题所在。
/// <summary>
/// An optional container in which to store the identity across requests.
/// When used, only a session identifier is sent
/// to the client. This can be used to mitigate potential problems
/// with very large identities.
/// </summary>
public IAuthenticationSessionStoreProvider SessionStoreProvider { get; set; }
IAuthenticationSessionStoreProvider 没有默认实现,但您可以查看它在AuthenticationSessionStoreWrapper 中的使用方式。
如果您添加提供者,它会被包裹在 AuthenticationSessionStoreWrapper
中:
static IAuthenticationSessionStore GetSessionStore(IAuthenticationSessionStoreProvider provider)
{
return provider != null ? new AuthenticationSessionStoreWrapper(provider) : null;
}
关于c# - 使用外部提供程序登录 IdentityServer 不能长时间使用 login_hint 或 acr_values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50331901/
我正在使用 Azure MobileServiceClient 通过移动应用进行身份验证。我想启用安全注销功能,其中涉及删除 Web 组件创建的 cookie。否则,如果周围潜伏着未过期的 cooki
我正在使用可用于登录的现成用户流程。我发现可以使用查询字符串参数 login_hint 传递电子邮件,但焦点仍然在电子邮件字段上,而我的客户希望避免使用额外的“选项卡”以加快登录过程。 我还找到了sa
我正在尝试将 login_hint 添加到 Azure AD 身份验证的 OpenID 登录请求。 将 login_hint 添加为属性对我不起作用: var properties = new Aut
我有一个 B2C 目录,我已经为这个目录设置了品牌。除此之外,我还使用自定义模板添加了登录、注册和重置策略。到目前为止没有问题。当我对登录策略发出质询时,页面将根据品牌配置呈现。当我尝试输入无效密码时
我正在使用 Google Sign-In JavaScript client并且还引用了 Example App 示例应用程序 (app.js) 告诉我 login_hint 是登录方法的有效选项:
我似乎记得 gapi.auth.authorize 有一个参数来指定一个 login_hint 来绕过帐户选择器。但我可能会谷歌,我找不到它。这只是一个梦吗? 我的问题是我遇到了帐户选择器在当前窗口下
在我的 OpenIdConnectAuthenticationOptions 中,我设置了 OpenIdConnectAuthenticationNotifications RedirectToIde
我们正在使用自定义登录/注册策略,将 Facebook、LinkedIn、Twitter、Google+ 配置为社交 IDP。 我们已经构建了一个自定义页面,我们要求用户提供他们的电子邮件,然后使用
获取使用Google api(oAuth2)的访问代码时,一个参数称为login_hint,其定义为; “当您的应用程序知道它正在尝试验证哪个用户时,它可能会将此参数作为提示提供给身份验证服务器。传递
我想将 login_hint 附加到对 Google 的身份验证请求中。我正在使用以下代码: FileDataStore fDS = new FileDataStore(Logger.Folder,
我一直在尝试向 AuthorizationCode 请求添加一个请求参数,作为 oauth2 身份验证流程的一部分,spring oauth2 过滤器向谷歌发送请求。具体来说,我需要添加一个 logi
我是一名优秀的程序员,十分优秀!