2

我们定制了 IdentityServer 2 以在 Azure AD 中提供身份联合功能(用于 Office 365 等)。这具有用于被动请求者流的 WS-Federation 端点和用于主动客户端的 WS-Trust。WS-Trust 的 MEX 端点应返回 WS-Trust SOAP 的 WSDL,以响应 POST(如 Lync 使用)和 GET(如 Windows 10 登录使用)。不幸的是,它返回 HTTP 400:ws-trust system.servicemodel.protocolexception “从网络接收的 XML 存在问题”。

从源码中可以看出: https ://github.com/IdentityServer/IdentityServer2/blob/master/src/Libraries/Thinktecture.IdentityServer.Protocols/WSTrust/TokenServiceHostFactory.cs

var host = new WSTrustServiceHost(config, baseAddresses);

// add behavior for load balancing support
host.Description.Behaviors.Add(new UseRequestHeadersForMetadataAddressBehavior());

// modify address filter mode for load balancing
var serviceBehavior = host.Description.Behaviors.Find<ServiceBehaviorAttribute>();
serviceBehavior.AddressFilterMode = AddressFilterMode.Any;
serviceBehavior.IncludeExceptionDetailInFaults = true;

System.ServiceModel.Security.WSTrustServiceHost 的一个实例被启动以处理对 WS-Trust 的调用,并处理其元数据。检查 WSTrustServiceHost ctor 中默认添加的 ServiceMetadataBehavior,我们可以看到它确实启用了通过 HTTP 和 HTTPS 进行 GET 的元数据。 http://referencesource.microsoft.com/#System.ServiceModel/System/ServiceModel/Security/WSTrustServiceHost.cs,8c80389f2532b060,references

所以我有点困惑,为什么https://myhost.com/issue/wstrust/mex在使用 POST 时返回元数据,但在发送 GET 时返回 400。System.ServiceModel http://referencesource.microsoft.com/#System.ServiceModel/System/ServiceModel/Channels/HttpPipeline.cs,b347567a68ab778c,references中的 EnqueueMessageAsyncResult.CompleteParseAndEnqueue() 中引发了异常

非常感谢任何帮助!

4

3 回答 3

2

对于其他卡在同一个地方的人,我已明确设置 TokenServiceHostFactory 以响应 HTTP GET。

// added for AAD Windows 10 sign in - device requests metadata with GET
ServiceMetadataBehavior metad = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (metad == null)
    metad = new ServiceMetadataBehavior();
for (int i = 0; i < baseAddresses.Length; i++)
{
    // there will be two bindings: one for http and one secure
    switch (baseAddresses[i].Scheme)
    {
        case "http":
            metad.HttpGetEnabled = true;
            metad.HttpGetUrl = new Uri(baseAddresses[i], "/issue/wstrust/mex");
            break;
        case "https":
            metad.HttpsGetEnabled = true;
            metad.HttpsGetUrl = new Uri(baseAddresses[i], "/issue/wstrust/mex");
            break;
    }
}
于 2017-03-29T11:49:42.990 回答
0

我已按照上述步骤将 IdentityServer2 与 AzureAD 集成。温通过微软单点登录测试连接工具运行测试,得到如下异常。从异常来看,读取元端点时似乎存在错误。

异常详细信息:消息:对象引用未设置为对象的实例。类型:System.NullReferenceException 堆栈跟踪:在 Microsoft.M365.RCA.Services.AdfsMetadataClient.GetMetaData(String mexEndpointUrl) 在 Microsoft.M365.RCA.FromServiceDescription(ServiceDescription wsd, String bindingName) 在 Microsoft.M365.RCA。 ConnectivityTests.SingleSignOnTestHelper.GetAdfsMetadata(RcaTestContext parentContext, String mexUrl, IAdfsMetadataClient metadataClient, IWebExceptionAnalyzer webExAnalyzer, AdfsMexInfo& adfsMetadata) at Microsoft.M365.RCA.ConnectivityTests.SingleSignOnTopLevelTest.<>c__DisplayClass8_0.b__0() at Microsoft.M365.RCA.ConnectivityTests.Comm RcaTestContext.ExecuteSteps(TestSuccessOperator successOperator, Func1[] stepFunctions) at Microsoft.M365.RCA.ConnectivityTests.SingleSignOnTopLevelTest.GetAndValidateAdfsMetadata(RcaTestContext parent, DomainRegistrationInfo registration) at Microsoft.M365.RCA.ConnectivityTests.Common.RcaTestContext.ExecuteSteps(TestSuccessOperator successOperator, Func1[] stepFunctions) 在 Microsoft.M365.RCA.ConnectivityTests.SingleSignOnTopLevelTest.PerformTestReally() 在 Microsoft.M365.RCA.ConnectivityTests.Test.PerformTest() 在 Microsoft.M365.RCA.ConnectivityTests.TopLevelTest.PerformTest() 在系统。 System.Threading.Tasks.Task.Execute() 处的 Threading.Tasks.Task`1.InnerInvoke() --- 从先前引发异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw ()在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)在 Microsoft.M365.RCA.Website.TestExecutionManager.TestCompleted(TestExecutionData 数据,ITopLevelTest topLevelTest,TestLoggingData loggingData)

于 2021-02-18T09:47:01.147 回答
0

那些遇到这个问题的人,有一个解决方法是获取 ADFS 元数据文件,然后使用您自己的 WS-Trust13 实现更改 usernamemixed 和 certificatemixed 的 WS-TRUST1.3 端点。Microsoft 似乎只支持它自己的 ADFS 元数据文件。我也联系了 Microsoft 支持,但他们尚未提供答案。尽管他们承认元数据解析可能被硬编码到 ADFS,并且与标准 WS-TRUST13 元数据实现不一致。

        <wsdl:port name="CertificateWSTrustBinding_IWSTrust13Async" binding="tns:CertificateWSTrustBinding_IWSTrust13Async">
        <soap12:address location="https://sts.gemalto.com/adfs/services/trust/13/certificatemixed"/>
        <wsa10:EndpointReference>
            <wsa10:Address>https://sts.gemalto.com/adfs/services/trust/13/certificatemixed</wsa10:Address>
        </wsa10:EndpointReference>
    </wsdl:port>
    <wsdl:port name="UserNameWSTrustBinding_IWSTrust13Async" binding="tns:UserNameWSTrustBinding_IWSTrust13Async">
        <soap12:address location="https://sts.gemalto.com/adfs/services/trust/13/usernamemixed"/>
        <wsa10:EndpointReference>
            <wsa10:Address>https://sts.gemalto.com/adfs/services/trust/13/usernamemixed</wsa10:Address>
        </wsa10:EndpointReference>
    </wsdl:port>
于 2021-03-14T08:55:51.083 回答