gpt4 book ai didi

c# - 在不使用 WIFI 的情况下在 WCF 服务调用中包含 SAML 2.0 token

转载 作者:可可西里 更新时间:2023-11-01 07:59:13 24 4
gpt4 key购买 nike

我正在尝试设置受 ADFS 保护的 WCF 服务。我目前能够请求 token 并使用 WIFThinktecture IdentityModel 4.5 将其与请求一起发送,代码如下:

static SecurityToken GetToken()
{
var factory = new WSTrustChannelFactory(
new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential),
"https://fs2.server2012.local/adfs/services/trust/13/usernamemixed")
{
TrustVersion = TrustVersion.WSTrust13
};


if (factory.Credentials != null)
{
factory.Credentials.UserName.UserName = @"username";
factory.Credentials.UserName.Password = "password";
}

var rst = new RequestSecurityToken
{
RequestType = RequestTypes.Issue,
KeyType = KeyTypes.Symmetric,
AppliesTo = new EndpointReference(
"https://wcfservicecertificate/wcfservice/Service.svc/wstrust"),
};

var channel = factory.CreateChannel();
RequestSecurityTokenResponse rstr;
return channel.Issue(rst, out rstr);
}

有了这个,我可以使用 ChannelFactory.CreateChannelWithIssuedToken 调用 WCF 服务:

var factory = new ChannelFactory<IService>(binding, 
new EndpointAddress("https://wcfservicecertificate/wcfservice/Service.svc/wstrust"));
if (factory.Credentials != null)
{
factory.Credentials.SupportInteractive = false;
factory.Credentials.UseIdentityConfiguration = true;
}

var proxy = factory.CreateChannelWithIssuedToken(GetToken());
var result= proxy.GetData(2);

这按预期工作,但只能在(移动)Windows 平台上使用。我也希望能够在 iOS 和 Android 上使用相同的原理。使用this article我能够使用以下代码从 ADFS 请求安全 token :

const string soapMessage =
@"<s:Envelope xmlns:s=""http://www.w3.org/2003/05/soap-envelope""
xmlns:a=""http://www.w3.org/2005/08/addressing""
xmlns:u=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"">
<s:Header>
<a:Action s:mustUnderstand=""1"">http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue</a:Action>
<a:To s:mustUnderstand=""1"">https://fs2.server2012.local/adfs/services/trust/13/UsernameMixed</a:To>
<o:Security s:mustUnderstand=""1"" xmlns:o=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"">
<o:UsernameToken u:Id=""uuid-6a13a244-dac6-42c1-84c5-cbb345b0c4c4-1"">
<o:Username>username</o:Username>
<o:Password Type=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"">password</o:Password>
</o:UsernameToken>
</o:Security>
</s:Header>
<s:Body>
<trust:RequestSecurityToken xmlns:trust=""http://docs.oasis-open.org/ws-sx/ws-trust/200512"">
<wsp:AppliesTo xmlns:wsp=""http://schemas.xmlsoap.org/ws/2004/09/policy"">
<a:EndpointReference>
<a:Address>https://wcfservicecertificate/wcfservice/Service.svc/wstrust</a:Address>
</a:EndpointReference>
</wsp:AppliesTo>
<trust:KeyType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/SymmetricKey</trust:KeyType>
<trust:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</trust:RequestType>
<trust:TokenType>urn:oasis:names:tc:SAML:2.0:assertion</trust:TokenType>
</trust:RequestSecurityToken>
</s:Body>
</s:Envelope>";


var webClient = new WebClient();

webClient.Headers.Add("Content-Type", "application/soap+xml; charset=utf-8");

var result = webClient.UploadString(
address: "https://fs2.server2012.local/adfs/services/trust/13/UsernameMixed",
method: "POST",
data: soapMessage);

这会生成一个 SAML2.0 token ,我想将其发送到我们的 WCF 服务以进行身份​​验证。有各种来源(包括前面提到的文章)表明这应该是可能的,但我还没有找到解决方案。

如有任何帮助,我们将不胜感激。

最佳答案

您可以使用一种混合解决方案,将 SAML 与 OAuth 或其他授权技术结合使用。这样可以更安全地抵御网络钓鱼技术。对于仅 SAML 方法,您可以引用以下链接:How to pass security tokenfrom one wcf service to another wcf service .据说您需要在 webconfig 上启用 saveBootstrapTokens 属性。

此链接也很有用:Availability of Bootstrap Tokens

关于c# - 在不使用 WIFI 的情况下在 WCF 服务调用中包含 SAML 2.0 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21292959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com