我有一个非常奇怪的问题,我已经试图调试了一周多。我对问题的根源毫无头绪,希望这里的某个人之前遇到过同样的问题,并能给我一个解决办法。
我正在开发一款asp .net core 2.0应用程序。独立运行时很好用。
以下是应用程序的主控制器的操作流程:
1. 需要身份验证。
2. 登录Identity Server 4。(混合授权类型)
3. 返回应用程序,获取数据并展示结果。
现在,当我尝试将此应用程序作为插件添加到主应用程序中时,它就无法正常工作。实际上,它会进入循环。插件以iFrame的形式显示在主应用程序中。
我看到插件有一个访问令牌。然后循环开始了。它返回到身份服务器再次请求访问,整个过程无休止地继续。
我发现独立运行和作为插件运行之间的不同之处在于日志中缺少这一行。
我正在开发一款asp .net core 2.0应用程序。独立运行时很好用。
以下是应用程序的主控制器的操作流程:
1. 需要身份验证。
2. 登录Identity Server 4。(混合授权类型)
3. 返回应用程序,获取数据并展示结果。
现在,当我尝试将此应用程序作为插件添加到主应用程序中时,它就无法正常工作。实际上,它会进入循环。插件以iFrame的形式显示在主应用程序中。
<iframe src="https://XXXXX" sandbox="allow-same-origin allow-scripts allow-forms allow-popups allow-popups-to-escape-sandbox" width="500" height="500"></iframe>
观察日志。我可以看到它被转发到身份验证服务器,记录返回到插件界面,我可以看到它。
OnSignedIn: IsAuthenticated = True
我看到插件有一个访问令牌。然后循环开始了。它返回到身份服务器再次请求访问,整个过程无休止地继续。
我发现独立运行和作为插件运行之间的不同之处在于日志中缺少这一行。
Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler[10]
AuthenticationScheme: Cookies signed in.
我还可以在请求头中看到,身份验证服务器返回了cookie标头并告诉它进行setcookie操作,但是它从未被设置。
为什么在iframe中无法设置cookie?
我尝试过的方法:
options.Cookie.SameSite = SameSiteMode.Lax;
options.Cookie.SecurePolicy = CookieSecurePolicy.None;
内容安全策略头包括身份服务器、插件站点和主要的网站应用程序。
为什么cookie没有设置?
插件认证代码。
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies", options =>
{
options.Cookie.SameSite = SameSiteMode.Lax;
options.Cookie.SecurePolicy = CookieSecurePolicy.None;
options.SessionStore = new MemoryCacheTicketStore();
})
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
options.Authority = Configuration["ServiceSettings:IdentityServerEndpoint"];
options.RequireHttpsMetadata = false;
options.ClientId = Configuration["ServiceSettings:ClientId"];
options.ClientSecret = Configuration["ServiceSettings:secret"];
options.ResponseType = "code id_token";
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.Scope.Add("profile");
options.Scope.Add("testapi");
});
}
标头
app.Use(async (ctx, next) =>
{
ctx.Response.Headers.Add("Content-Security-Policy", Configuration["DefaultApplicationSettings:ContentSecurityPolicy"]);
await next();
});
设置
"DefaultApplicationSettings": {
"ContentSecurityPolicy": "default-src 'self' plugin webapp; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com/ webapp; font-src 'self' https://fonts.gstatic.com/ webapp; frame-ancestors 'self' webapp" },
由于公司隐私原因,网址已更改。