Skip to content
This repository was archived by the owner on Dec 24, 2020. It is now read-only.

Commit fb7473e

Browse files
committed
Introduce OpenIdConnectRequest.HasAcrValue()
1 parent 4b90cdd commit fb7473e

File tree

4 files changed

+96
-2
lines changed

4 files changed

+96
-2
lines changed

src/AspNet.Security.OpenIdConnect.Primitives/OpenIdConnectExtensions.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,31 @@ public static IEnumerable<string> GetScopes([NotNull] this OpenIdConnectRequest
5757
return GetValues(request.Scope, OpenIdConnectConstants.Separators.Space).Distinct(StringComparer.Ordinal);
5858
}
5959

60+
/// <summary>
61+
/// Determines whether the requested authentication context class values contain the specified item.
62+
/// </summary>
63+
/// <param name="request">The <see cref="OpenIdConnectRequest"/> instance.</param>
64+
/// <param name="value">The component to look for in the parameter.</param>
65+
public static bool HasAcrValue([NotNull] this OpenIdConnectRequest request, [NotNull] string value)
66+
{
67+
if (request == null)
68+
{
69+
throw new ArgumentNullException(nameof(request));
70+
}
71+
72+
if (string.IsNullOrEmpty(value))
73+
{
74+
throw new ArgumentException("The value cannot be null or empty.", nameof(value));
75+
}
76+
77+
if (string.IsNullOrEmpty(request.AcrValues))
78+
{
79+
return false;
80+
}
81+
82+
return HasValue(request.AcrValues, value, OpenIdConnectConstants.Separators.Space);
83+
}
84+
6085
/// <summary>
6186
/// Determines whether the requested prompt contains the specified value.
6287
/// </summary>

src/AspNet.Security.OpenIdConnect.Server/OpenIdConnectServerHandler.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,8 @@ private async Task<bool> SignInAsync(AuthenticationTicket ticket)
462462
}
463463

464464
var scopes = ticket.GetScopes();
465-
if (request.IsAuthorizationCodeGrantType() || !new HashSet<string>(scopes).SetEquals(request.GetScopes()))
465+
if ((request.IsTokenRequest() && request.IsAuthorizationCodeGrantType()) ||
466+
!new HashSet<string>(scopes).SetEquals(request.GetScopes()))
466467
{
467468
response.Scope = string.Join(" ", scopes);
468469
}

src/Owin.Security.OpenIdConnect.Server/OpenIdConnectServerHandler.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,8 @@ private async Task<bool> HandleSignInAsync(AuthenticationTicket ticket)
484484
}
485485

486486
var scopes = ticket.GetScopes();
487-
if (request.IsAuthorizationCodeGrantType() || !new HashSet<string>(scopes).SetEquals(request.GetScopes()))
487+
if ((request.IsTokenRequest() && request.IsAuthorizationCodeGrantType()) ||
488+
!new HashSet<string>(scopes).SetEquals(request.GetScopes()))
488489
{
489490
response.Scope = string.Join(" ", scopes);
490491
}

test/AspNet.Security.OpenIdConnect.Primitives.Tests/OpenIdConnectExtensionsTests.cs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,73 @@ public void GetScopes_ReturnsExpectedScopes(string scope, string[] scopes)
8787
Assert.Equal(scopes, request.GetScopes());
8888
}
8989

90+
[Fact]
91+
public void HasAcrValue_ThrowsAnExceptionForNullRequest()
92+
{
93+
// Arrange
94+
var request = (OpenIdConnectRequest) null;
95+
96+
// Act and assert
97+
var exception = Assert.Throws<ArgumentNullException>(delegate
98+
{
99+
request.HasAcrValue("mod-mf");
100+
});
101+
102+
Assert.Equal("request", exception.ParamName);
103+
}
104+
105+
[Theory]
106+
[InlineData(null)]
107+
[InlineData("")]
108+
public void HasAcrValue_ThrowsAnExceptionForNullOrEmptyAcrValue(string value)
109+
{
110+
// Arrange
111+
var request = new OpenIdConnectRequest();
112+
113+
// Act and assert
114+
var exception = Assert.Throws<ArgumentException>(delegate
115+
{
116+
request.HasAcrValue(value);
117+
});
118+
119+
Assert.Equal("value", exception.ParamName);
120+
Assert.StartsWith("The value cannot be null or empty.", exception.Message);
121+
}
122+
123+
[Theory]
124+
[InlineData(null, false)]
125+
[InlineData("mod-mf", true)]
126+
[InlineData("mod-mf mod-pr", true)]
127+
[InlineData(" mod-mf mod-pr", true)]
128+
[InlineData("mod-pr mod-mf", true)]
129+
[InlineData("mod-pr mod-mf ", true)]
130+
[InlineData("mod-pr mod-mf mod-cstm", true)]
131+
[InlineData("mod-pr mod-mf mod-cstm ", true)]
132+
[InlineData("mod-pr mod-mf mod-cstm ", true)]
133+
[InlineData("mod-pr", false)]
134+
[InlineData("mod-pr mod-cstm", false)]
135+
[InlineData("MOD-MF", false)]
136+
[InlineData("MOD-MF MOD-PR", false)]
137+
[InlineData(" MOD-MF MOD-PR", false)]
138+
[InlineData("MOD-PR MOD-MF", false)]
139+
[InlineData("MOD-PR MOD-MF ", false)]
140+
[InlineData("MOD-PR MOD-MF MOD-CSTM", false)]
141+
[InlineData("MOD-PR MOD-MF MOD-CSTM ", false)]
142+
[InlineData("MOD-PR MOD-MF MOD-CSTM ", false)]
143+
[InlineData("MOD-PR", false)]
144+
[InlineData("MOD-PR MOD-CSTM", false)]
145+
public void HasAcrValue_ReturnsExpectedResult(string value, bool result)
146+
{
147+
// Arrange
148+
var request = new OpenIdConnectRequest
149+
{
150+
AcrValues = value
151+
};
152+
153+
// Act and assert
154+
Assert.Equal(result, request.HasAcrValue("mod-mf"));
155+
}
156+
90157
[Fact]
91158
public void HasPrompt_ThrowsAnExceptionForNullRequest()
92159
{

0 commit comments

Comments
 (0)