From 7c426f7835731e620f7dd0d03f58bf63ab33d301 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 25 Jun 2015 17:30:09 -0700 Subject: [PATCH] React to Http/AuthNZ changes --- .../Authorization/AuthorizeFilter.cs | 2 +- .../ChallengeResult.cs | 7 ++-- .../Controller.cs | 16 ++++----- .../Authorization/AuthorizeFilterTest.cs | 4 +-- .../ChallengeResultTest.cs | 14 ++++---- .../ControllerTests.cs | 34 +++++++++---------- .../ControllerUnitTestabilityTests.cs | 2 +- .../FiltersTest.cs | 2 +- .../BasicAuthenticationHandler.cs | 13 ++----- .../WebSites/FiltersWebSite/ManagerHandler.cs | 2 +- test/WebSites/FiltersWebSite/Startup.cs | 6 +++- 11 files changed, 50 insertions(+), 52 deletions(-) diff --git a/src/Microsoft.AspNet.Mvc.Extensions/Authorization/AuthorizeFilter.cs b/src/Microsoft.AspNet.Mvc.Extensions/Authorization/AuthorizeFilter.cs index 7403af9348..2d84e95e81 100644 --- a/src/Microsoft.AspNet.Mvc.Extensions/Authorization/AuthorizeFilter.cs +++ b/src/Microsoft.AspNet.Mvc.Extensions/Authorization/AuthorizeFilter.cs @@ -38,7 +38,7 @@ namespace Microsoft.AspNet.Mvc var newPrincipal = new ClaimsPrincipal(); foreach (var scheme in Policy.ActiveAuthenticationSchemes) { - var result = (await context.HttpContext.Authentication.AuthenticateAsync(scheme))?.Principal; + var result = await context.HttpContext.Authentication.AuthenticateAsync(scheme); if (result != null) { newPrincipal.AddIdentities(result.Identities); diff --git a/src/Microsoft.AspNet.Mvc.Extensions/ChallengeResult.cs b/src/Microsoft.AspNet.Mvc.Extensions/ChallengeResult.cs index 7c18f1aec1..8f1fa10735 100644 --- a/src/Microsoft.AspNet.Mvc.Extensions/ChallengeResult.cs +++ b/src/Microsoft.AspNet.Mvc.Extensions/ChallengeResult.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; +using System.Threading.Tasks; using Microsoft.AspNet.Http.Authentication; using Microsoft.Framework.Internal; @@ -44,19 +45,19 @@ namespace Microsoft.AspNet.Mvc public AuthenticationProperties Properties { get; set; } - public override void ExecuteResult([NotNull] ActionContext context) + public override async Task ExecuteResultAsync([NotNull] ActionContext context) { var auth = context.HttpContext.Authentication; if (AuthenticationSchemes.Count > 0) { foreach (var scheme in AuthenticationSchemes) { - auth.Challenge(scheme, Properties); + await auth.ChallengeAsync(scheme, Properties); } } else { - auth.Challenge(Properties); + await auth.ChallengeAsync(Properties); } } } diff --git a/src/Microsoft.AspNet.Mvc.Extensions/Controller.cs b/src/Microsoft.AspNet.Mvc.Extensions/Controller.cs index 99a6b39516..83da9d9754 100644 --- a/src/Microsoft.AspNet.Mvc.Extensions/Controller.cs +++ b/src/Microsoft.AspNet.Mvc.Extensions/Controller.cs @@ -394,7 +394,7 @@ namespace Microsoft.AspNet.Mvc var disposableValue = data as IDisposable; if (disposableValue != null) { - Response.OnResponseCompleted(_ => disposableValue.Dispose(), state: null); + Response.OnCompletedDispose(disposableValue); } return new JsonResult(data); @@ -417,7 +417,7 @@ namespace Microsoft.AspNet.Mvc var disposableValue = data as IDisposable; if (disposableValue != null) { - Response.OnResponseCompleted(_ => disposableValue.Dispose(), state: null); + Response.OnCompletedDispose(disposableValue); } return new JsonResult(data, serializerSettings); @@ -705,7 +705,7 @@ namespace Microsoft.AspNet.Mvc { if (fileStream != null) { - Response.OnResponseCompleted(_ => fileStream.Dispose(), state: null); + Response.OnCompletedDispose(fileStream); } return new FileStreamResult(fileStream, contentType) { FileDownloadName = fileDownloadName }; @@ -769,7 +769,7 @@ namespace Microsoft.AspNet.Mvc var disposableValue = value as IDisposable; if (disposableValue != null) { - Response.OnResponseCompleted(_ => disposableValue.Dispose(), state: null); + Response.OnCompletedDispose(disposableValue); } return new HttpNotFoundObjectResult(value); @@ -795,7 +795,7 @@ namespace Microsoft.AspNet.Mvc var disposableValue = error as IDisposable; if (disposableValue != null) { - Response.OnResponseCompleted(_ => disposableValue.Dispose(), state: null); + Response.OnCompletedDispose(disposableValue); } return new BadRequestObjectResult(error); @@ -823,7 +823,7 @@ namespace Microsoft.AspNet.Mvc var disposableValue = value as IDisposable; if (disposableValue != null) { - Response.OnResponseCompleted(_ => disposableValue.Dispose(), state: null); + Response.OnCompletedDispose(disposableValue); } return new CreatedResult(uri, value); @@ -893,7 +893,7 @@ namespace Microsoft.AspNet.Mvc var disposableValue = value as IDisposable; if (disposableValue != null) { - Response.OnResponseCompleted(_ => disposableValue.Dispose(), state: null); + Response.OnCompletedDispose(disposableValue); } return new CreatedAtActionResult(actionName, controllerName, routeValues, value); @@ -936,7 +936,7 @@ namespace Microsoft.AspNet.Mvc var disposableValue = value as IDisposable; if (disposableValue != null) { - Response.OnResponseCompleted(_ => disposableValue.Dispose(), state: null); + Response.OnCompletedDispose(disposableValue); } return new CreatedAtRouteResult(routeName, routeValues, value); diff --git a/test/Microsoft.AspNet.Mvc.Extensions.Test/Authorization/AuthorizeFilterTest.cs b/test/Microsoft.AspNet.Mvc.Extensions.Test/Authorization/AuthorizeFilterTest.cs index 4e7f8bfdc7..075e7b40f9 100644 --- a/test/Microsoft.AspNet.Mvc.Extensions.Test/Authorization/AuthorizeFilterTest.cs +++ b/test/Microsoft.AspNet.Mvc.Extensions.Test/Authorization/AuthorizeFilterTest.cs @@ -316,8 +316,8 @@ namespace Microsoft.AspNet.Mvc.Test httpContext.Object.User = validUser; } httpContext.SetupGet(c => c.RequestServices).Returns(serviceProvider); - auth.Setup(c => c.AuthenticateAsync("Bearer")).ReturnsAsync(new AuthenticationResult(bearerPrincipal, new AuthenticationProperties(), new AuthenticationDescription())); - auth.Setup(c => c.AuthenticateAsync("Basic")).ReturnsAsync(new AuthenticationResult(basicPrincipal, new AuthenticationProperties(), new AuthenticationDescription())); + auth.Setup(c => c.AuthenticateAsync("Bearer")).ReturnsAsync(bearerPrincipal); + auth.Setup(c => c.AuthenticateAsync("Basic")).ReturnsAsync(basicPrincipal); auth.Setup(c => c.AuthenticateAsync("Fails")).ReturnsAsync(null); // AuthorizationContext diff --git a/test/Microsoft.AspNet.Mvc.Extensions.Test/ChallengeResultTest.cs b/test/Microsoft.AspNet.Mvc.Extensions.Test/ChallengeResultTest.cs index 08cd8297da..abcd92cf68 100644 --- a/test/Microsoft.AspNet.Mvc.Extensions.Test/ChallengeResultTest.cs +++ b/test/Microsoft.AspNet.Mvc.Extensions.Test/ChallengeResultTest.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Collections.Generic; +using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Routing; @@ -13,7 +13,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test.ActionResults public class ChallengeResultTest { [Fact] - public void ChallengeResult_Execute() + public async Task ChallengeResult_Execute() { // Arrange var result = new ChallengeResult("", null); @@ -29,14 +29,14 @@ namespace Microsoft.AspNet.Mvc.Core.Test.ActionResults new ActionDescriptor()); // Act - result.ExecuteResult(actionContext); + await result.ExecuteResultAsync(actionContext); // Assert - auth.Verify(c => c.Challenge("", null), Times.Exactly(1)); + auth.Verify(c => c.ChallengeAsync("", null), Times.Exactly(1)); } [Fact] - public void ChallengeResult_ExecuteNoSchemes() + public async Task ChallengeResult_ExecuteNoSchemes() { // Arrange var result = new ChallengeResult(new string[] { }, null); @@ -52,10 +52,10 @@ namespace Microsoft.AspNet.Mvc.Core.Test.ActionResults new ActionDescriptor()); // Act - result.ExecuteResult(actionContext); + await result.ExecuteResultAsync(actionContext); // Assert - auth.Verify(c => c.Challenge((AuthenticationProperties)null), Times.Exactly(1)); + auth.Verify(c => c.ChallengeAsync((AuthenticationProperties)null), Times.Exactly(1)); } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Mvc.Extensions.Test/ControllerTests.cs b/test/Microsoft.AspNet.Mvc.Extensions.Test/ControllerTests.cs index 187f745daf..80ab851346 100644 --- a/test/Microsoft.AspNet.Mvc.Extensions.Test/ControllerTests.cs +++ b/test/Microsoft.AspNet.Mvc.Extensions.Test/ControllerTests.cs @@ -430,7 +430,7 @@ namespace Microsoft.AspNet.Mvc.Test { // Arrange var mockHttpContext = new Mock(); - mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny>(), It.IsAny())); + mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny())); var uri = new Uri("/test/url", UriKind.Relative); var controller = new TestableController() @@ -448,7 +448,7 @@ namespace Microsoft.AspNet.Mvc.Test Assert.Equal(uri.OriginalString, result.Location); Assert.Same(input, result.Value); mockHttpContext.Verify( - x => x.Response.OnResponseCompleted(It.IsAny>(), It.IsAny()), + x => x.Response.OnCompletedDispose(It.IsAny()), Times.Once()); } @@ -517,7 +517,7 @@ namespace Microsoft.AspNet.Mvc.Test { // Arrange var mockHttpContext = new Mock(); - mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny>(), It.IsAny())); + mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny())); var controller = new TestableController() { @@ -534,7 +534,7 @@ namespace Microsoft.AspNet.Mvc.Test Assert.Equal("SampleAction", result.ActionName); Assert.Same(input, result.Value); mockHttpContext.Verify( - x => x.Response.OnResponseCompleted(It.IsAny>(), It.IsAny()), + x => x.Response.OnCompletedDispose(It.IsAny()), Times.Once()); } @@ -600,7 +600,7 @@ namespace Microsoft.AspNet.Mvc.Test { // Arrange var mockHttpContext = new Mock(); - mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny>(), It.IsAny())); + mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny())); var controller = new TestableController() { @@ -617,7 +617,7 @@ namespace Microsoft.AspNet.Mvc.Test Assert.Equal("SampleRoute", result.RouteName); Assert.Same(input, result.Value); mockHttpContext.Verify( - x => x.Response.OnResponseCompleted(It.IsAny>(), It.IsAny()), + x => x.Response.OnCompletedDispose(It.IsAny()), Times.Once()); } @@ -694,7 +694,7 @@ namespace Microsoft.AspNet.Mvc.Test { // Arrange var mockHttpContext = new Mock(); - mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny>(), It.IsAny())); + mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny())); var controller = new TestableController() { ActionContext = new ActionContext(mockHttpContext.Object, new RouteData(), new ActionDescriptor()) @@ -716,7 +716,7 @@ namespace Microsoft.AspNet.Mvc.Test { // Arrange var mockHttpContext = new Mock(); - mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny>(), It.IsAny())); + mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny())); var controller = new TestableController() { @@ -733,7 +733,7 @@ namespace Microsoft.AspNet.Mvc.Test Assert.Equal("application/pdf", result.ContentType.ToString()); Assert.Equal("someDownloadName", result.FileDownloadName); mockHttpContext.Verify( - x => x.Response.OnResponseCompleted(It.IsAny>(), It.IsAny()), + x => x.Response.OnCompletedDispose(It.IsAny()), Times.Once()); } @@ -785,7 +785,7 @@ namespace Microsoft.AspNet.Mvc.Test { // Arrange var mockHttpContext = new Mock(); - mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny>(), It.IsAny())); + mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny())); var controller = new TestableController() { @@ -801,7 +801,7 @@ namespace Microsoft.AspNet.Mvc.Test Assert.Equal(StatusCodes.Status404NotFound, result.StatusCode); Assert.Same(input, result.Value); mockHttpContext.Verify( - x => x.Response.OnResponseCompleted(It.IsAny>(), It.IsAny()), + x => x.Response.OnCompletedDispose(It.IsAny()), Times.Once()); } @@ -840,7 +840,7 @@ namespace Microsoft.AspNet.Mvc.Test { // Arrange var mockHttpContext = new Mock(); - mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny>(), It.IsAny())); + mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny())); var controller = new TestableController() { @@ -856,7 +856,7 @@ namespace Microsoft.AspNet.Mvc.Test Assert.Equal(StatusCodes.Status400BadRequest, result.StatusCode); Assert.Same(input, result.Value); mockHttpContext.Verify( - x => x.Response.OnResponseCompleted(It.IsAny>(), It.IsAny()), + x => x.Response.OnCompletedDispose(It.IsAny()), Times.Once()); } @@ -1053,7 +1053,7 @@ namespace Microsoft.AspNet.Mvc.Test { // Arrange var mockHttpContext = new Mock(); - mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny>(), It.IsAny())); + mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny())); var controller = new TestableController() { @@ -1068,7 +1068,7 @@ namespace Microsoft.AspNet.Mvc.Test Assert.IsType(result); Assert.Same(input, result.Value); mockHttpContext.Verify( - x => x.Response.OnResponseCompleted(It.IsAny>(), It.IsAny()), + x => x.Response.OnCompletedDispose(It.IsAny()), Times.Once()); } @@ -1077,7 +1077,7 @@ namespace Microsoft.AspNet.Mvc.Test { // Arrange var mockHttpContext = new Mock(); - mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny>(), It.IsAny())); + mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny())); var controller = new TestableController() { @@ -1093,7 +1093,7 @@ namespace Microsoft.AspNet.Mvc.Test Assert.IsType(result); Assert.Same(input, result.Value); mockHttpContext.Verify( - x => x.Response.OnResponseCompleted(It.IsAny>(), It.IsAny()), + x => x.Response.OnCompletedDispose(It.IsAny()), Times.Once()); } diff --git a/test/Microsoft.AspNet.Mvc.Extensions.Test/ControllerUnitTestabilityTests.cs b/test/Microsoft.AspNet.Mvc.Extensions.Test/ControllerUnitTestabilityTests.cs index 94d30b4a05..0eeed2d287 100644 --- a/test/Microsoft.AspNet.Mvc.Extensions.Test/ControllerUnitTestabilityTests.cs +++ b/test/Microsoft.AspNet.Mvc.Extensions.Test/ControllerUnitTestabilityTests.cs @@ -150,7 +150,7 @@ namespace Microsoft.AspNet.Mvc var contentType = "text/html"; var fileName = "Created.html"; var mockHttpContext = new Mock(); - mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny>(), It.IsAny())); + mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny())); var controller = new TestabilityController() { ActionContext = new ActionContext(mockHttpContext.Object, new RouteData(), new ActionDescriptor()) diff --git a/test/Microsoft.AspNet.Mvc.FunctionalTests/FiltersTest.cs b/test/Microsoft.AspNet.Mvc.FunctionalTests/FiltersTest.cs index 50025d6a8e..3d3efec7f2 100644 --- a/test/Microsoft.AspNet.Mvc.FunctionalTests/FiltersTest.cs +++ b/test/Microsoft.AspNet.Mvc.FunctionalTests/FiltersTest.cs @@ -155,7 +155,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests "http://localhost/AuthorizeUser/Impossible"); // Assert - Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + Assert.Equal(HttpStatusCode.Forbidden, response.StatusCode); } [Fact] diff --git a/test/WebSites/FiltersWebSite/BasicAuthenticationHandler.cs b/test/WebSites/FiltersWebSite/BasicAuthenticationHandler.cs index c86b750d35..89a814a941 100644 --- a/test/WebSites/FiltersWebSite/BasicAuthenticationHandler.cs +++ b/test/WebSites/FiltersWebSite/BasicAuthenticationHandler.cs @@ -13,15 +13,7 @@ namespace FiltersWebSite { public class BasicAuthenticationHandler : AuthenticationHandler { - protected override void ApplyResponseChallenge() - { - } - - protected override void ApplyResponseGrant() - { - } - - protected override AuthenticationTicket AuthenticateCore() + public override Task AuthenticateAsync() { var principal = new ClaimsPrincipal(); principal.AddIdentity(new ClaimsIdentity( @@ -32,7 +24,8 @@ namespace FiltersWebSite new Claim(ClaimTypes.NameIdentifier, "John") }, Options.AuthenticationScheme)); - return new AuthenticationTicket(principal, new AuthenticationProperties(), Options.AuthenticationScheme); + return Task.FromResult(new AuthenticationTicket(principal, + new AuthenticationProperties(), Options.AuthenticationScheme)); } } } \ No newline at end of file diff --git a/test/WebSites/FiltersWebSite/ManagerHandler.cs b/test/WebSites/FiltersWebSite/ManagerHandler.cs index ed0292ef2f..bc5c614dbd 100644 --- a/test/WebSites/FiltersWebSite/ManagerHandler.cs +++ b/test/WebSites/FiltersWebSite/ManagerHandler.cs @@ -10,7 +10,7 @@ namespace FiltersWebSite { public class ManagerHandler : AuthorizationHandler { - public override void Handle(AuthorizationContext context, OperationAuthorizationRequirement requirement) + protected override void Handle(AuthorizationContext context, OperationAuthorizationRequirement requirement) { if (context.User.HasClaim("Manager", "yes")) { diff --git a/test/WebSites/FiltersWebSite/Startup.cs b/test/WebSites/FiltersWebSite/Startup.cs index c425ecbfa7..96301f6cfd 100644 --- a/test/WebSites/FiltersWebSite/Startup.cs +++ b/test/WebSites/FiltersWebSite/Startup.cs @@ -18,7 +18,11 @@ namespace FiltersWebSite services.ConfigureAuthorization(options => { // This policy cannot succeed since the claim is never added - options.AddPolicy("Impossible", policy => policy.RequireClaim("Never")); + options.AddPolicy("Impossible", policy => + { + policy.ActiveAuthenticationSchemes.Add("Interactive"); + policy.RequireClaim("Never"); + }); options.AddPolicy("Api", policy => { policy.ActiveAuthenticationSchemes.Add("Api");