我应该说,我才刚刚开始探索SAML身份验证并遇到了身份验证问题,不幸的是,我无法在开发机器上重现该问题,这使我更加困惑。
我使用OWIN进行以下配置:
var options = new Saml2AuthenticationOptions(false)
{
Notifications = new Saml2Notifications
{
AuthenticationRequestCreated = (request, provider, dictionary) =>
{
request.Binding = Saml2BindingType.HttpPost;
}
},
AuthenticationType = services.AuthenticationType,
Caption = services.Caption,
SPOptions = new SPOptions
{
EntityId = new EntityId(Path.Combine(services.RelyingPartyUri, "Saml2"))
}
};
options.IdentityProviders.Add(new IdentityProvider(new EntityId(services.IdentityProviderConfiguration.IdentityProviderMetadataUri), options.SPOptions)
{
AllowUnsolicitedAuthnResponse = true,
Binding = Saml2BindingType.HttpPost,
LoadMetadata = true,
SingleSignOnServiceUrl = new Uri(services.IdentityProviderConfiguration.SingleSignOnUri)
});
app.UseSaml2Authentication(options);
services
变量包含元数据uri,sso uri等配置。
此配置在我的机器上完美运行。我检查了登录SAML请求,这是我所拥有的:
<saml2p:AuthnRequest
xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
ID="id10c4b76119b64952857d38c7581ca0b4"
Version="2.0"
IssueInstant="2018-12-04T14:29:00Z"
Destination="https://identity.provider/trust/saml2/http-post/sso/application"
ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
AssertionConsumerServiceURL="https://application/Saml2/Acs">
<saml2:Issuer>https://application/Saml2</saml2:Issuer>
</saml2p:AuthnRequest>
然后身份验证可以正常工作。
当我将此代码部署到外部服务器以进行测试时,有时可以按预期工作,但是我经常无法对用户进行身份验证,因为身份验证机制使用http-redirect代替了http-post。
在这种情况下,我看到以下登录SAML请求:
<saml2p:AuthnRequest
xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
ID="id10c4b76119b64952857d38c7581ca0b4"
Version="2.0"
IssueInstant="2018-12-04T14:29:00Z"
Destination="https://identity.provider/trust/saml2/http-redirect/sso/application"
ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
AssertionConsumerServiceURL="https://application/Saml2/Acs">
<saml2:Issuer>https://application/Saml2</saml2:Issuer>
</saml2p:AuthnRequest>
用于身份验证的SSO uri中的差异。
到目前为止,我所做的是检查配置文件以消除配置问题。所有配置均有效,并且services.IdentityProviderConfiguration.SingleSignOnUri
包含带有http-post的有效SSO uri。我使用了不同的设置,正如您在代码段中所看到的,我将Binding设置为HttpPost,我认为应该解决我的问题,以防万一SingleSignOnServiceUrl
是从IDP元数据中自动获取的。我还浏览了sustainsys.SAML2源代码,找不到任何可以给我线索的东西。
任何帮助表示赞赏!
答案 0 :(得分:1)
如果您设置LoadMetadata=true
,则在元数据中找到的设置将覆盖您的手动配置。显然,Idp的元数据包含具有POST绑定的端点https://identity.provider/trust/saml2/http-redirect/sso/application
。
要解决此问题,请Idp正确获取其元数据。或设置LoadMetadata=false
并依靠代码内配置。在这种情况下,您必须将Idp签名证书添加到您的代码中。