From 7b31e034ca7ee952a1d5bdef5956bcc1493df6c8 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 25 Jun 2015 17:10:13 -0700 Subject: [PATCH] React to Http changes --- .../AuthenticationHandler.cs | 21 +++++++-------- .../FeatureContext.cs | 9 ++++--- .../RequestProcessing/Response.cs | 18 ++++++------- .../AuthenticationTests.cs | 26 +++++++------------ 4 files changed, 34 insertions(+), 40 deletions(-) diff --git a/src/Microsoft.AspNet.Server.WebListener/AuthenticationHandler.cs b/src/Microsoft.AspNet.Server.WebListener/AuthenticationHandler.cs index 5f0515d3ae..225d45a388 100644 --- a/src/Microsoft.AspNet.Server.WebListener/AuthenticationHandler.cs +++ b/src/Microsoft.AspNet.Server.WebListener/AuthenticationHandler.cs @@ -43,14 +43,14 @@ namespace Microsoft.AspNet.Server.WebListener _customChallenges = AuthenticationSchemes.None; } - public void Authenticate(AuthenticateContext context) + public Task AuthenticateAsync(AuthenticateContext context) { var user = _requestContext.User; var identity = user == null ? null : (ClaimsIdentity)user.Identity; foreach (var authType in ListEnabledAuthSchemes()) { - string authScheme = authType.ToString(); + var authScheme = authType.ToString(); if (string.Equals(authScheme, context.AuthenticationScheme, StringComparison.Ordinal)) { if (identity != null && identity.IsAuthenticated @@ -64,29 +64,26 @@ namespace Microsoft.AspNet.Server.WebListener } } } - } - - public Task AuthenticateAsync(AuthenticateContext context) - { - Authenticate(context); return Task.FromResult(0); } - public void Challenge(ChallengeContext context) + public Task ChallengeAsync(ChallengeContext context) { foreach (var scheme in ListEnabledAuthSchemes()) { var authScheme = scheme.ToString(); // Not including any auth types means it's a blanket challenge for any auth type. - if (context.AuthenticationScheme == null || + if (context.AuthenticationScheme == string.Empty || string.Equals(context.AuthenticationScheme, authScheme, StringComparison.Ordinal)) { + _requestContext.Response.StatusCode = 401; _customChallenges |= scheme; context.Accept(); } } // A challenge was issued, it overrides any pre-set auth types. _requestContext.AuthenticationChallenges = _customChallenges; + return Task.FromResult(0); } public void GetDescriptions(DescribeSchemesContext context) @@ -98,14 +95,16 @@ namespace Microsoft.AspNet.Server.WebListener } } - public void SignIn(SignInContext context) + public Task SignInAsync(SignInContext context) { // Not supported + return Task.FromResult(0); } - public void SignOut(SignOutContext context) + public Task SignOutAsync(SignOutContext context) { // Not supported + return Task.FromResult(0); } private IDictionary GetDescription(string authenticationScheme) diff --git a/src/Microsoft.AspNet.Server.WebListener/FeatureContext.cs b/src/Microsoft.AspNet.Server.WebListener/FeatureContext.cs index 80f8d86f24..e113cc0f34 100644 --- a/src/Microsoft.AspNet.Server.WebListener/FeatureContext.cs +++ b/src/Microsoft.AspNet.Server.WebListener/FeatureContext.cs @@ -47,7 +47,7 @@ namespace Microsoft.AspNet.Server.WebListener IHttpUpgradeFeature, IHttpRequestIdentifierFeature { - private static Action OnStartDelegate = OnStart; + private static Func OnStartDelegate = OnStart; private RequestContext _requestContext; private FeatureCollection _features; @@ -378,12 +378,12 @@ namespace Microsoft.AspNet.Server.WebListener get { return Response.HasStarted; } } - void IHttpResponseFeature.OnResponseStarting(Action callback, object state) + void IHttpResponseFeature.OnResponseStarting(Func callback, object state) { Response.OnResponseStarting(callback, state); } - void IHttpResponseFeature.OnResponseCompleted(Action callback, object state) + void IHttpResponseFeature.OnResponseCompleted(Func callback, object state) { Response.OnResponseCompleted(callback, state); } @@ -484,11 +484,12 @@ namespace Microsoft.AspNet.Server.WebListener set { _requestId = value; } } - private static void OnStart(object obj) + private static Task OnStart(object obj) { var featureContext = (FeatureContext)obj; ConsiderEnablingResponseCache(featureContext); + return Task.FromResult(0); } private static void ConsiderEnablingResponseCache(FeatureContext featureContext) diff --git a/src/Microsoft.Net.Http.Server/RequestProcessing/Response.cs b/src/Microsoft.Net.Http.Server/RequestProcessing/Response.cs index 17ad8688ed..65a6442e6e 100644 --- a/src/Microsoft.Net.Http.Server/RequestProcessing/Response.cs +++ b/src/Microsoft.Net.Http.Server/RequestProcessing/Response.cs @@ -48,8 +48,8 @@ namespace Microsoft.Net.Http.Server private long _expectedBodyLength; private BoundaryType _boundaryType; private HttpApi.HTTP_RESPONSE_V2 _nativeResponse; - private IList, object>> _onResponseStartingActions; - private IList, object>> _onResponseCompletedActions; + private IList, object>> _onResponseStartingActions; + private IList, object>> _onResponseCompletedActions; private RequestContext _requestContext; private bool _bufferingEnabled; @@ -80,8 +80,8 @@ namespace Microsoft.Net.Http.Server _nativeResponse.Response_V1.Version.MajorVersion = 1; _nativeResponse.Response_V1.Version.MinorVersion = 1; _responseState = ResponseState.Created; - _onResponseStartingActions = new List, object>>(); - _onResponseCompletedActions = new List, object>>(); + _onResponseStartingActions = new List, object>>(); + _onResponseCompletedActions = new List, object>>(); _bufferingEnabled = _requestContext.Server.BufferResponses; _expectedBodyLength = 0; _nativeStream = null; @@ -773,18 +773,18 @@ namespace Microsoft.Net.Http.Server _nativeStream.SwitchToOpaqueMode(); } - public void OnResponseStarting(Action callback, object state) + public void OnResponseStarting(Func callback, object state) { - IList, object>> actions = _onResponseStartingActions; + var actions = _onResponseStartingActions; if (actions == null) { throw new InvalidOperationException("Response already started"); } - actions.Add(new Tuple, object>(callback, state)); + actions.Add(new Tuple, object>(callback, state)); } - public void OnResponseCompleted(Action callback, object state) + public void OnResponseCompleted(Func callback, object state) { var actions = _onResponseCompletedActions; if (actions == null) @@ -792,7 +792,7 @@ namespace Microsoft.Net.Http.Server throw new InvalidOperationException("Response already completed"); } - actions.Add(new Tuple, object>(callback, state)); + actions.Add(new Tuple, object>(callback, state)); } private void NotifyOnSendingHeaders() diff --git a/test/Microsoft.AspNet.Server.WebListener.FunctionalTests/AuthenticationTests.cs b/test/Microsoft.AspNet.Server.WebListener.FunctionalTests/AuthenticationTests.cs index cf0fb50a39..f802a8d3bb 100644 --- a/test/Microsoft.AspNet.Server.WebListener.FunctionalTests/AuthenticationTests.cs +++ b/test/Microsoft.AspNet.Server.WebListener.FunctionalTests/AuthenticationTests.cs @@ -256,17 +256,16 @@ namespace Microsoft.AspNet.Server.WebListener { string address; var authTypeList = authType.ToString().Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries); - using (Utilities.CreateHttpAuthServer(authType | AuthenticationSchemes.AllowAnonymous, out address, env => + using (Utilities.CreateHttpAuthServer(authType | AuthenticationSchemes.AllowAnonymous, out address, async env => { var context = new DefaultHttpContext((IFeatureCollection)env); Assert.NotNull(context.User); Assert.False(context.User.Identity.IsAuthenticated); foreach (var scheme in authTypeList) { - var authResults = context.Authentication.Authenticate(scheme); + var authResults = await context.Authentication.AuthenticateAsync(scheme); Assert.Null(authResults); } - return Task.FromResult(0); })) { var response = await SendRequestAsync(address); @@ -286,7 +285,7 @@ namespace Microsoft.AspNet.Server.WebListener { string address; var authTypeList = authType.ToString().Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries); - using (Utilities.CreateHttpAuthServer(authType, out address, env => + using (Utilities.CreateHttpAuthServer(authType, out address, async env => { var context = new DefaultHttpContext((IFeatureCollection)env); Assert.NotNull(context.User); @@ -294,14 +293,13 @@ namespace Microsoft.AspNet.Server.WebListener var count = 0; foreach (var scheme in authTypeList) { - var authResults = context.Authentication.Authenticate(scheme); + var authResults = await context.Authentication.AuthenticateAsync(scheme); if (authResults != null) { count++; } } Assert.Equal(1, count); - return Task.FromResult(0); })) { var response = await SendRequestAsync(address, useDefaultCredentials: true); @@ -325,8 +323,7 @@ namespace Microsoft.AspNet.Server.WebListener var context = new DefaultHttpContext((IFeatureCollection)env); Assert.NotNull(context.User); Assert.False(context.User.Identity.IsAuthenticated); - context.Authentication.Challenge(); - return Task.FromResult(0); + return context.Authentication.ChallengeAsync(); })) { var response = await SendRequestAsync(address); @@ -346,16 +343,15 @@ namespace Microsoft.AspNet.Server.WebListener { string address; var authTypeList = authType.ToString().Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries); - using (Utilities.CreateHttpAuthServer(authType | AuthenticationSchemes.AllowAnonymous, out address, env => + using (Utilities.CreateHttpAuthServer(authType | AuthenticationSchemes.AllowAnonymous, out address, async env => { var context = new DefaultHttpContext((IFeatureCollection)env); Assert.NotNull(context.User); Assert.False(context.User.Identity.IsAuthenticated); foreach (var scheme in authTypeList) { - context.Authentication.Challenge(scheme); + await context.Authentication.ChallengeAsync(scheme); } - return Task.FromResult(0); })) { var response = await SendRequestAsync(address); @@ -379,8 +375,7 @@ namespace Microsoft.AspNet.Server.WebListener var context = new DefaultHttpContext((IFeatureCollection)env); Assert.NotNull(context.User); Assert.False(context.User.Identity.IsAuthenticated); - context.Authentication.Challenge(authType.ToString()); - return Task.FromResult(0); + return context.Authentication.ChallengeAsync(authType.ToString()); })) { var response = await SendRequestAsync(address); @@ -407,12 +402,11 @@ namespace Microsoft.AspNet.Server.WebListener var context = new DefaultHttpContext((IFeatureCollection)env); Assert.NotNull(context.User); Assert.False(context.User.Identity.IsAuthenticated); - Assert.Throws(() => context.Authentication.Challenge(authType.ToString())); - return Task.FromResult(0); + return Assert.ThrowsAsync(() => context.Authentication.ChallengeAsync(authType.ToString())); })) { var response = await SendRequestAsync(address); - Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(0, response.Headers.WwwAuthenticate.Count); } }