【发布时间】:2019-05-23 22:24:29
【问题描述】:
我将 IdentityServer4 作为身份验证系统运行,以使用 Google 和 Amazon 以及本地帐户。我有一个单独的 Web 应用程序,使用 IdentityServer4 系统作为 oidc 身份验证提供程序,并且事情似乎与身份验证和颁发令牌一起工作。问题是它在身份验证后不维护 returnUrl。我正在使用通过 Redis 分布式缓存内置到 Id4 的 OIDC StateDataFormatterCache,并在 Redis 中验证它正在写入重定向,甚至是我在质询时添加的测试参数。
身份验证后,它不会将我重定向回原始 url,当我尝试访问质询中设置的参数和 AuthenticationProperties 时,它们似乎在身份验证后不存在。
我已经通过 IdentityServer4 端的代码进行了本地和外部回调的登录,returnUrl 永远不会出现在那里。我假设 OIDC StateDataFormatterCache 会拦截它以防止潜在的长 url 问题,并且应该拦截响应并注入返回 url。那部分似乎不起作用,所以我试图看看我是否可以将我自己的自定义参数粘贴到 auth 道具中,并在 auth 发生后将其取回,但结果是空的。 AuthenticationProperties 似乎只有 access_token、refresh_token、id_token 等,但缺少重定向 url 和我的自定义参数。
services.AddOidcStateDataFormatterCache("oidc");
...
var authProps = new AuthenticationProperties { RedirectUri = originalPath + context.Request.QueryString };
Microsoft.Extensions.Primitives.StringValues stateValue;
if (context.Request.Query.TryGetValue("state", out stateValue))
{
authProps.SetParameter("itk", stateValue);
}
await Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions.ChallengeAsync(context,"oidc", authProps); //authProps has custom parameter 'itk' and a redirect
...
var authContext = await context.AuthenticateAsync("oidc");
//authContext.Properties has data but not the RedirectUri or the custom parameter I set and verified to exist in the redis store
以下是 Redis 中显示的内容:
{
"Items": {
".redirect": "/?state=foo",
".xsrf": "DkRjG29eE4qDFaNLSktyTDKfhdzXH8FfVpAwBbje6tc",
"OpenIdConnect.Code.RedirectUri": "https://localhost/signin-oidc"
},
"Parameters": {
"itk": [
"foo"
]
},
"RedirectUri": "/?state=foo"
}
关于为什么我无法检索状态数据格式化程序放入 Redis 的信息的任何想法?
我需要能够在参数中获取“itk”的值。
我发现我的问题是重定向无法通过,但我仍然需要能够获取该参数。
【问题讨论】:
-
在这里查看我的答案:stackoverflow.com/questions/56060611/… 如果没有帮助,请编辑您的问题以解释您的案例与其他问题的区别。
标签: c# identityserver4