gpt4 book ai didi

c# - 使用外部提供程序登录 IdentityServer 不能长时间使用 login_hint 或 acr_values

转载 作者:太空狗 更新时间:2023-10-29 21:56:24 25 4
gpt4 key购买 nike

在我的 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

编辑2

为什么这么快就达到了限制:

显然我的 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。

但问题仍然存在。

如果Token真的很长怎么办?

最佳答案

我不能确定,但​​是,这听起来可能是最大 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com