@@ -139,11 +139,19 @@ protected override async Task<bool> HandleUnauthorizedAsync([NotNull] ChallengeC
139
139
// [brentschmaltz] - #215 this should be a property on RedirectToIdentityProviderNotification not on the OIDCMessage.
140
140
RequestType = OpenIdConnectRequestType . AuthenticationRequest ,
141
141
Resource = Options . Resource ,
142
- ResponseMode = Options . ResponseMode ,
143
142
ResponseType = Options . ResponseType ,
144
143
Scope = Options . Scope
145
144
} ;
146
145
146
+ // Omitting the response_mode parameter when it already corresponds to the default
147
+ // response_mode used for the specified response_type is recommended by the specifications.
148
+ // See http://openid.net/specs/oauth-v2-multiple-response-types-1_0.html#ResponseModes
149
+ if ( ! string . Equals ( Options . ResponseType , OpenIdConnectResponseTypes . Code , StringComparison . Ordinal ) ||
150
+ ! string . Equals ( Options . ResponseMode , OpenIdConnectResponseModes . Query , StringComparison . Ordinal ) )
151
+ {
152
+ message . ResponseMode = Options . ResponseMode ;
153
+ }
154
+
147
155
if ( Options . ProtocolValidator . RequireNonce )
148
156
{
149
157
message . Nonce = Options . ProtocolValidator . GenerateNonce ( ) ;
@@ -236,8 +244,22 @@ protected override async Task<AuthenticationTicket> HandleAuthenticateAsync()
236
244
237
245
OpenIdConnectMessage message = null ;
238
246
247
+ if ( string . Equals ( Request . Method , "GET" , StringComparison . OrdinalIgnoreCase ) )
248
+ {
249
+ message = new OpenIdConnectMessage ( Request . Query ) ;
250
+
251
+ // response_mode=query (explicit or not) and a response_type containing id_token
252
+ // or token are not considered as a safe combination and MUST be rejected.
253
+ // See http://openid.net/specs/oauth-v2-multiple-response-types-1_0.html#Security
254
+ if ( ! string . IsNullOrWhiteSpace ( message . IdToken ) || ! string . IsNullOrWhiteSpace ( message . Token ) )
255
+ {
256
+ Logger . LogError ( "An OpenID Connect response cannot contain an identity token " +
257
+ "or an access token when using response_mode=query" ) ;
258
+ return null ;
259
+ }
260
+ }
239
261
// assumption: if the ContentType is "application/x-www-form-urlencoded" it should be safe to read as it is small.
240
- if ( string . Equals ( Request . Method , "POST" , StringComparison . OrdinalIgnoreCase )
262
+ else if ( string . Equals ( Request . Method , "POST" , StringComparison . OrdinalIgnoreCase )
241
263
&& ! string . IsNullOrWhiteSpace ( Request . ContentType )
242
264
// May have media/type; charset=utf-8, allow partial match.
243
265
&& Request . ContentType . StartsWith ( "application/x-www-form-urlencoded" , StringComparison . OrdinalIgnoreCase )
0 commit comments