Skip to content

Commit 5c7e091

Browse files
committed
Enhance Passkey origin validation to be case insensitive for scheme and host
1 parent 7afe526 commit 5c7e091

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

common/src/main/java/com/microsoft/identity/common/internal/providers/oauth2/PasskeyOriginRulesManager.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,16 +92,16 @@ object PasskeyOriginRulesManager {
9292
val uri = URI(url)
9393

9494
// Validate scheme
95-
if (uri.scheme != HTTPS_SCHEME) {
95+
if (uri.scheme.lowercase() != HTTPS_SCHEME) {
9696
return false
9797
}
9898

9999
// Validate host and build origin
100100
val host = uri.host ?: return false
101-
val origin = "https://$host"
101+
val origin = "https://$host".lowercase()
102102

103103
// Check if it's a production origin (any path allowed)
104-
if (PRODUCTION_ORIGINS.contains(origin)) {
104+
if (PRODUCTION_ORIGINS.contains(origin)){
105105
return true
106106
}
107107

common/src/test/java/com/microsoft/identity/common/internal/providers/oauth2/PasskeyOriginRulesManagerTest.kt

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,32 @@ class PasskeyOriginRulesManagerTest {
171171
assertTrue(PasskeyOriginRulesManager.isAllowedOrigin("https://login.microsoftonline.us/path/fIdO"))
172172
}
173173

174+
@Test
175+
fun `isAllowedOrigin is case insensitive for schema`() {
176+
assertTrue(PasskeyOriginRulesManager.isAllowedOrigin("HTTPS://login.microsoft.com"))
177+
assertTrue(PasskeyOriginRulesManager.isAllowedOrigin("Https://account.live.com"))
178+
assertTrue(PasskeyOriginRulesManager.isAllowedOrigin("HtTpS://mysignins.microsoft.com"))
179+
assertTrue(PasskeyOriginRulesManager.isAllowedOrigin("HtTpS://login.microsoftonline.us/fido"))
180+
}
181+
182+
@Test
183+
fun `isAllowedOrigin is case insensitive for host`() {
184+
assertTrue(PasskeyOriginRulesManager.isAllowedOrigin("https://LOGIN.MICROSOFT.COM"))
185+
assertTrue(PasskeyOriginRulesManager.isAllowedOrigin("https://Login.Microsoft.Com"))
186+
assertTrue(PasskeyOriginRulesManager.isAllowedOrigin("https://ACCOUNT.LIVE.COM"))
187+
assertTrue(PasskeyOriginRulesManager.isAllowedOrigin("https://Account.Live.Com/"))
188+
assertTrue(PasskeyOriginRulesManager.isAllowedOrigin("https://MYSIGNINS.MICROSOFT.COM"))
189+
assertTrue(PasskeyOriginRulesManager.isAllowedOrigin("https://MySignins.Microsoft.Com/auth/passkey"))
190+
}
191+
192+
@Test
193+
fun `isAllowedOrigin is case insensitive for mixed case schema and host`() {
194+
assertTrue(PasskeyOriginRulesManager.isAllowedOrigin("HtTpS://LoGiN.MiCrOsOfT.CoM"))
195+
assertTrue(PasskeyOriginRulesManager.isAllowedOrigin("HtTpS://AcCoUnT.LiVe.CoM/page/webauthn"))
196+
assertTrue(PasskeyOriginRulesManager.isAllowedOrigin("HtTpS://MySignins.MiCrOsOfT.CoM/auth/passkey"))
197+
assertTrue(PasskeyOriginRulesManager.isAllowedOrigin("HtTpS://LoGiN.MiCrOsOfToNlInE.Us/FiDo"))
198+
}
199+
174200
// ==================== Subdomain Spoofing Prevention Tests ====================
175201

176202
@Test
@@ -277,4 +303,3 @@ class PasskeyOriginRulesManagerTest {
277303
assertTrue(rules.size >= 12) // At least production + sovereign cloud origins
278304
}
279305
}
280-

0 commit comments

Comments
 (0)