我们的客户有一个Azure AD,其中包含位于世界各地的公司中的所有用户。他希望他的用户能够使用Azure AD上的Microsoft帐户登录我们的SP应用程序。
显然,由于Azure AD使用SAML 2.0,而SharePoint使用Ws-Fed(类似于SAML 1.1),我们需要将这些声明从2.0转换为Ws-Fed(或SAML 1.1)。
这曾经是使用Azure的Azure Control Services完成的,该服务将在年底(2018年)弃用,因此开发使用它的解决方案毫无意义。
因此,我们发现了许多指南here和here,详细说明了如何在Azure AD和ADFS之间创建声明提供程序信任,并在AD FS和SharePoint之间设置依赖方信任。
理论上,这可以通过以下方式工作:
我们似乎在转换步骤中遇到了一个问题。我们使用Fiddler调试了该进程,以查看进出AD FS服务器的请求。 Azure AD声明已成功发送到AD FS,但是当AD FS发出新声明(假设在Ws-Fed或SAML 1.1中)时会遇到错误。
以下是AD FS的堆栈跟踪:
Microsoft.IdentityServer.Web.RequestFailedException: MSIS7012: An error occurred while processing the request. Contact your administrator for details. ---> System.ServiceModel.FaultException: MSIS3127: The specified request failed.
at Microsoft.IdentityServer.Protocols.WSTrust.WSTrustClientManager.Issue(Message request, WCFResponseData responseData)
at Microsoft.IdentityServer.Protocols.WSTrust.WSTrustClient.Issue(RequestSecurityToken rst, WCFResponseData responseData)
at Microsoft.IdentityServer.Web.FederationPassiveAuthentication.SubmitRequest(MSISRequestSecurityToken request)
--- End of inner exception stack trace ---
at Microsoft.IdentityServer.Web.FederationPassiveAuthentication.SubmitRequest(MSISRequestSecurityToken request)
at Microsoft.IdentityServer.Web.FederationPassiveAuthentication.RequestBearerToken(MSISSignInRequestMessage signInRequest, SecurityTokenElement onBehalfOf, SecurityToken primaryAuthToken, String desiredTokenType, UInt32 lifetime, Uri& replyTo)
at Microsoft.IdentityServer.Web.FederationPassiveAuthentication.RequestBearerToken(MSISSignInRequestMessage signInRequest, SecurityTokenElement onBehalfOf, SecurityToken primaryAuthToken, String desiredTokenType, MSISSession& session)
at Microsoft.IdentityServer.Web.FederationPassiveAuthentication.BuildSignInResponseCoreWithSerializedToken(String signOnToken, WSFederationMessage incomingMessage)
at Microsoft.IdentityServer.Web.FederationPassiveAuthentication.BuildSignInResponseForProtocolResponse(FederationPassiveContext federationPassiveContext)
at Microsoft.IdentityServer.Web.FederationPassiveAuthentication.BuildSignInResponse(FederationPassiveContext federationPassiveContext, SecurityToken securityToken)
System.ServiceModel.FaultException: MSIS3127: The specified request failed.
at Microsoft.IdentityServer.Protocols.WSTrust.WSTrustClientManager.Issue(Message request, WCFResponseData responseData)
at Microsoft.IdentityServer.Protocols.WSTrust.WSTrustClient.Issue(RequestSecurityToken rst, WCFResponseData responseData)
at Microsoft.IdentityServer.Web.FederationPassiveAuthentication.SubmitRequest(MSISRequestSecurityToken request)
我们还完成了内部测试,我们使用本地AD登录到SharePoint网站,以确保AD FS和SharePoint之间的设置正确无误。这按预期工作,SharePoint收到了步骤4中配置的声明。
任何有关从SAML 2.0到Ws-Fed(或SAML 1.1)的“转换”过程的帮助将不胜感激。
帮助我Obi-Wan Kenobi,你是我唯一的希望!
将AD FS'PreventTokenReplays param设置为false
在我们的例子中,这就是我们坚持了几天的原因。在我们阅读的任何地方都没有提到这一点,我们只是在进入AD FS服务器的事件查看器并浏览日志后才发现它。
打开PowerShell,使用以下命令添加AD FS管理单元:
Add-PSSnapin Microsoft.Adfs.PowerShell
然后,使用以下命令获取AD FS属性:
Get-adfsproperties
检查PreventTokenReplays参数的值。如果它被设置为假,你应该是好的。如果设置为true,则使用以下命令将其翻转为false:
Set-adfsproperties -PreventTokenReplays $false
现在,您需要重新启动AD FS服务。只需转到services.msc,找到AD FS 2.0 Windows服务,右键单击它,然后点击重启。