在使用任何标准身份提供商(Google,Facebook)登录并同意后,他们会重定向到我的主要身份服务器,并让它重定向到在其中注册的隐式客户端。如何使用另一个作为外部身份提供者的Identity Server实现相同的行为?
我的安全架构由两个身份服务器组成,主要一个(v3)使用另一个(v4)作为外部身份提供者。隐式客户端打开一个主IdentityServer的弹出窗口。
我遇到以下问题:
充当外部IdP的Identity Server卡在端点上:
/connect/authorize/login?client_id=primaryIdentityServer&redirect_uri=https://primaryIdentityServer.example.com/signin-oidc&response_mode=form_post&response_type=code id_token&scope=openid profile email
错误消息:
Refused to send form data to 'https://jsclient.example.com/#(...)' because it violates the following Content Security Policy directive: "form-action https://primaryIdentityServer.example.com".
外部身份提供商的主要IdentityServer配置:
var opts = new OpenIdConnectAuthenticationOptions {
ClientId = "primaryServer",
ClientSecret = "secret",
RedirectUri = "https://primaryIdentityServer.example.com/signin-oidc",
Authority = "https://externalIdPIdentityServer.example.com",
ResponseType = "code id_token",
Scope = "openid profile email",
SignInAsAuthenticationType = signInAsType
};
app.UseOpenIdConnectAuthentication(opts);
IdentityServer主要在IdentityServer中注册,作为外部IdP:
new Client
{
ClientId = "primaryServer",
AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
RedirectUris = new List<string>
{
"https://primaryIdentityServer.example.com/signin-oidc"
},
ClientSecrets =
{
new Secret("secret".Sha256())
},
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
IdentityServerConstants.StandardScopes.Email
},
AlwaysIncludeUserClaimsInIdToken = true
}
编辑:当我尝试检查/permissions
端点上的应用权限并使用外部IdentityServer进行身份验证时,我注意到我已经重定向到权限端点而没有任何问题。
编辑:我尝试过切换到Identity Server之间的隐式流程。从response_type中删除了秘密code
并将隐式设置为允许的授权类型,并且我仍然收到将发布数据发送到我的js客户端的相同错误,因此看起来所选流(混合或隐式)与此问题无关。 / p>
编辑:我已经检查了认证过程停滞的端点来源:
<form method='post' action='https://primaryIdentityServer.example.com/signin-oidc'><input type='hidden' name='id_token' value='{token}' />
<input type='hidden' name='access_token' value='{token}' />
<input type='hidden' name='token_type' value='Bearer' />
<input type='hidden' name='expires_in' value='3600' />
<input type='hidden' name='scope' value='openid profile' />
<input type='hidden' name='state' value='OpenIdConnect.AuthenticationProperties={props}' />
<input type='hidden' name='session_state' value='{state}' />
</form><script>(function(){document.forms[0].submit();})();</script>
带查询参数的:
https://externalIdPIdentityServer.example.com/connect/authorize/consent?client_id=primaryServer&redirect_uri=https://primaryIdentityServer.example.com/signin-oidc&response_mode=form_post&response_type=token id_token&scope=openid profile&state={state}&nonce={nonce}
所以错误的原因很简单:
Refused to send form data to 'https://jsclient.example.com/#(...)' because it violates the following Content Security Policy directive: "form-action https://primaryIdentityServer.example.com".
因为jsclient.example.com并未在任何地方提及。
编辑:问题仅出现在Chrome中,而不会出现在Firefox或IE Edge中。
答案 0 :(得分:3)
我开始搜索&#34; chrome&#34;和&#34; csp&#34; IdentityServer4中的关键字发布并找到了这个:https://github.com/IdentityServer/IdentityServer4/issues/659
事实证明,需要更改授权响应的表单操作CSP,并且1.0.1版本的IdentityServer4版本放宽了此策略指令。
我将IdentityServer4从1.0.0更新到1.0.2,它解决了这个问题。