Skip to content

Commit 6fd88a6

Browse files
authored
Enable add Claims and AdditionalRequestParameters to request (#4987)
* Enable add Claims and AdditionalRequestParameters to request * Address review feedback.
1 parent 47a4950 commit 6fd88a6

File tree

3 files changed

+134
-6
lines changed

3 files changed

+134
-6
lines changed

src/System.ServiceModel.Federation/src/System/ServiceModel/Federation/WSTrustChannelSecurityTokenProvider.cs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33
// See the LICENSE file in the project root for more information.
44

5+
using System.Collections.Generic;
56
using System.ComponentModel;
67
using System.Diagnostics.Tracing;
7-
using System.IdentityModel.Security;
88
using System.IdentityModel.Selectors;
99
using System.IdentityModel.Tokens;
1010
using System.IO;
@@ -20,6 +20,7 @@
2020
using System.Xml;
2121
using Microsoft.IdentityModel.Protocols;
2222
using Microsoft.IdentityModel.Protocols.WsAddressing;
23+
using Microsoft.IdentityModel.Protocols.WsFed;
2324
using Microsoft.IdentityModel.Protocols.WsPolicy;
2425
using Microsoft.IdentityModel.Protocols.WsTrust;
2526
using SecurityToken = System.IdentityModel.Tokens.SecurityToken;
@@ -107,7 +108,7 @@ private void CacheSecurityTokenResponse(WsTrustRequest request, WsTrustResponse
107108
/// <returns></returns>
108109
internal virtual ChannelFactory<IRequestChannel> ChannelFactory { get; set; }
109110

110-
internal ClientCredentials ClientCredentials { get; set; }
111+
internal protected ClientCredentials ClientCredentials { get; set; }
111112

112113
/// <summary>
113114
/// Creates a <see cref="WsTrustRequest"/> from the <see cref="WSTrustTokenParameters"/>
@@ -167,6 +168,27 @@ protected virtual WsTrustRequest CreateWsTrustRequest()
167168
trustRequest.ComputedKeyAlgorithm = _requestSerializationContext.TrustKeyTypes.PSHA1;
168169
}
169170

171+
if (WSTrustTokenParameters.Claims != null)
172+
{
173+
List<ClaimType> claimTypes = new List<ClaimType>();
174+
foreach (ClaimType claimType in WSTrustTokenParameters.Claims.ClaimTypes)
175+
{
176+
claimTypes.Add(new ClaimType()
177+
{
178+
IsOptional = claimType.IsOptional,
179+
Uri = claimType.Uri,
180+
Value = claimType.Value
181+
});
182+
}
183+
184+
trustRequest.Claims = new Claims(WSTrustTokenParameters.Claims.Dialect, claimTypes);
185+
}
186+
187+
foreach (XmlElement parameter in WSTrustTokenParameters.AdditionalRequestParameters)
188+
{
189+
trustRequest.AdditionalXmlElements.Add((XmlElement)parameter.CloneNode(true));
190+
}
191+
170192
return trustRequest;
171193
}
172194

src/System.ServiceModel.Federation/src/System/ServiceModel/Federation/WsTrustTokenParameters.cs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System.ServiceModel.Channels;
1010
using System.ServiceModel.Security.Tokens;
1111
using System.Xml;
12+
using Microsoft.IdentityModel.Protocols.WsFed;
1213
using Microsoft.IdentityModel.Protocols.WsTrust;
1314
using Microsoft.IdentityModel.Tokens.Saml2;
1415

@@ -49,11 +50,25 @@ protected WSTrustTokenParameters(WSTrustTokenParameters other)
4950
: base(other)
5051
{
5152
foreach (var parameter in other.AdditionalRequestParameters)
52-
AdditionalRequestParameters.Add(parameter);
53+
AdditionalRequestParameters.Add((XmlElement)parameter.CloneNode(true));
5354

5455
CacheIssuedTokens = other.CacheIssuedTokens;
55-
foreach (var claimType in ClaimTypes)
56-
ClaimTypes.Add(claimType);
56+
57+
if (other.Claims != null)
58+
{
59+
List<ClaimType> claimTypes = new List<ClaimType>();
60+
foreach (var claimType in other.Claims.ClaimTypes)
61+
{
62+
claimTypes.Add(new ClaimType()
63+
{
64+
IsOptional = claimType.IsOptional,
65+
Uri = claimType.Uri,
66+
Value = claimType.Value
67+
});
68+
}
69+
70+
Claims = new Claims(other.Claims.Dialect, claimTypes);
71+
}
5772

5873
_issuedTokenRenewalThresholdPercentage = other.IssuedTokenRenewalThresholdPercentage;
5974
KeySize = other.KeySize;
@@ -84,7 +99,7 @@ protected override SecurityTokenParameters CloneCore()
8499
/// Allows the addition of <see cref="Claims"/> to the WSTrust request
85100
/// <para>see: http://docs.oasis-open.org/ws-sx/ws-trust/200512/ws-trust-1.3-os.html </para>
86101
/// </summary>
87-
public ICollection<Claims> ClaimTypes { get; } = new Collection<Claims>();
102+
public Claims Claims { get; set; }
88103

89104
/// <summary>
90105
/// Gets or sets the percentage of the issued token's lifetime at which it should be renewed instead of cached.
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using System.Collections.Generic;
6+
using System.Collections.ObjectModel;
7+
using System.IdentityModel.Selectors;
8+
using System.IdentityModel.Tokens;
9+
using System.Linq;
10+
using System.ServiceModel.Description;
11+
using System.Xml;
12+
using Infrastructure.Common;
13+
using Microsoft.IdentityModel.Protocols.WsFed;
14+
using Microsoft.IdentityModel.Protocols.WsTrust;
15+
using Microsoft.IdentityModel.Tokens.Saml2;
16+
using Xunit;
17+
18+
namespace System.ServiceModel.Federation.Tests
19+
{
20+
public static class WSTrustChannelSecurityTokenProviderTest
21+
{
22+
[WcfFact]
23+
public static void EnsibilityTest()
24+
{
25+
string claimUri = "http://example.org/claims/simplecustomclaim";
26+
string claimValue = "sample claim value";
27+
var claims = new Claims("dialect", new List<ClaimType>() { new ClaimType() { Uri = claimUri, IsOptional = false, Value = claimValue } });
28+
var issuerAddress = new EndpointAddress(new Uri("http://localhost/issuer.svc"));
29+
var targetAddress = new EndpointAddress(new Uri("http://localhost/target.svc"));
30+
var issuerBinding = new WSHttpBinding(SecurityMode.Transport);
31+
string eln1 = "Element1";
32+
string eln2 = "Element2";
33+
var additionalElements= new Collection<XmlElement>() { new XmlDocument().CreateElement(eln1), new XmlDocument().CreateElement(eln2) };
34+
35+
var tokenParams = new WSTrustTokenParameters
36+
{
37+
Claims= claims,
38+
IssuerAddress = issuerAddress,
39+
IssuerBinding = issuerBinding,
40+
KeyType = SecurityKeyType.SymmetricKey,
41+
TokenType = Saml2Constants.OasisWssSaml2TokenProfile11,
42+
MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11
43+
};
44+
45+
foreach(XmlElement element in additionalElements)
46+
{
47+
tokenParams.AdditionalRequestParameters.Add(element);
48+
}
49+
50+
var tokenRequirement = new System.IdentityModel.Selectors.SecurityTokenRequirement()
51+
{
52+
TokenType = "urn:oasis:names:tc:SAML:1.0:assertion"
53+
};
54+
55+
tokenRequirement.Properties["http://schemas.microsoft.com/ws/2006/05/servicemodel/securitytokenrequirement/IssuedSecurityTokenParameters"] = tokenParams;
56+
tokenRequirement.Properties["http://schemas.microsoft.com/ws/2006/05/servicemodel/securitytokenrequirement/TargetAddress"] = targetAddress;
57+
tokenRequirement.Properties["http://schemas.microsoft.com/ws/2006/05/servicemodel/securitytokenrequirement/SecurityAlgorithmSuite"] = System.ServiceModel.Security.SecurityAlgorithmSuite.Default;
58+
59+
var derivedTokenProvider = new WSTrustChannelSecurityTokenProviderDerived(tokenRequirement);
60+
61+
(derivedTokenProvider as ICommunicationObject).Open();
62+
63+
WsTrustRequest trustRequest = derivedTokenProvider.CreateWsTrustRequestHelper();
64+
65+
Assert.NotNull(trustRequest);
66+
Assert.NotNull(trustRequest.Claims);
67+
Assert.Equal(claims.Dialect, trustRequest.Claims.Dialect);
68+
ClaimType ctype = trustRequest.Claims.ClaimTypes.FirstOrDefault();
69+
Assert.NotNull(ctype);
70+
Assert.Equal(claimUri, ctype.Uri);
71+
Assert.Equal(claimValue, ctype.Value);
72+
Assert.False(ctype.IsOptional);
73+
Assert.Equal(2, trustRequest.AdditionalXmlElements.Count);
74+
Assert.Equal(eln1, trustRequest.AdditionalXmlElements[0].Name);
75+
Assert.Equal(eln2, trustRequest.AdditionalXmlElements[1].Name);
76+
}
77+
}
78+
79+
public class WSTrustChannelSecurityTokenProviderDerived : WSTrustChannelSecurityTokenProvider
80+
{
81+
public WSTrustChannelSecurityTokenProviderDerived(SecurityTokenRequirement tokenRequirement) : base(tokenRequirement)
82+
{
83+
}
84+
85+
public Microsoft.IdentityModel.Protocols.WsTrust.WsTrustRequest CreateWsTrustRequestHelper()
86+
{
87+
ClientCredentials = new ClientCredentials();
88+
return base.CreateWsTrustRequest();
89+
}
90+
}
91+
}

0 commit comments

Comments
 (0)