带有Windows身份验证/当前登录用户的C#ADFS SAML令牌

带有Windows身份验证/当前登录用户的C#ADFS SAML令牌,c#,saml,adfs,C#,Saml,Adfs,如何在不再次使用凭据的情况下生成SAML令牌 场景:我正在尝试向SAP web服务发送SAML令牌。由于多个用户将使用此应用程序,我不想要求他们提供凭据,而是从当前计算机windows凭据获取凭据并生成SAML令牌 这就是我的代码中当前正在使用的内容 factory.Credentials.UserName.UserName = "bob"; factory.Credentials.UserName.Password = "abc!123"; // create token request v

如何在不再次使用凭据的情况下生成SAML令牌

场景:我正在尝试向SAP web服务发送SAML令牌。由于多个用户将使用此应用程序,我不想要求他们提供凭据,而是从当前计算机windows凭据获取凭据并生成SAML令牌

这就是我的代码中当前正在使用的内容

factory.Credentials.UserName.UserName = "bob";
factory.Credentials.UserName.Password = "abc!123";

// create token request
var rst = new RequestSecurityToken
{
    RequestType = RequestTypes.Issue,
    KeyType = KeyTypes.Symmetric,
    AppliesTo = new EndpointReference(_serviceAddress.AbsoluteUri)
};

我在代码中使用此方法将登录用户的凭据传递到我们的ADFS服务器,以便从我编写的应用程序单次登录到O365;您可以根据自己的目的调整代码:

    private GenericXmlSecurityToken NewGetAdfsSamlTokenWinAuth()
    {
        try
        {
            WS2007HttpBinding binding = new WS2007HttpBinding(SecurityMode.Transport);
            binding.Security.Message.EstablishSecurityContext = false;
            binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
            WSTrustChannelFactory factory = new WSTrustChannelFactory((binding), new EndpointAddress(this.adfsIntegratedAuthUrl));
            factory.TrustVersion = TrustVersion.WSTrustFeb2005;
            factory.Credentials.SupportInteractive = false;
            var rst = new RequestSecurityToken
            {
                RequestType = RequestTypes.Issue,
                AppliesTo = new EndpointReference("urn:federation:MicrosoftOnline"),
                KeyType = KeyTypes.Bearer
            };
            IWSTrustChannelContract channel = factory.CreateChannel();
            return channel.Issue(rst) as GenericXmlSecurityToken;
        }
        catch (Exception ex)
        {
            // Do something with the exception
        }
        return null;
    }

这将返回一个GenericXmlSecurityToken,它具有包含SAML断言的TokenXml.OuterXml属性。

在我使用“”的情况下,您可以帮助我使用“This.adfsIntegratedAuthUrl”变量的值,但在身份验证方面有一些问题确定:我使用的是https://{0}/adfs/services/trust/2005/windowstransport/,我通过string.format从this.adfsAuthUrl中获取主机属性,这是从另一个方法返回的URI,该方法基于用户的UPN执行HRD(主域发现)查找。但是,如果您只处理一个域,则只需将{0}替换为ADFS服务器的硬编码FQDN,例如: