带有Windows身份验证/当前登录用户的C#ADFS SAML令牌
如何在不再次使用凭据的情况下生成SAML令牌 场景:我正在尝试向SAP web服务发送SAML令牌。由于多个用户将使用此应用程序,我不想要求他们提供凭据,而是从当前计算机windows凭据获取凭据并生成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
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,例如: