React to Http/AuthNZ changes

This commit is contained in:
Hao Kung 2015-06-25 17:30:09 -07:00
parent a3cbb1f378
commit 7c426f7835
11 changed files with 50 additions and 52 deletions

View File

@ -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);

View File

@ -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);
}
}
}

View File

@ -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);

View File

@ -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

View File

@ -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));
}
}
}

View File

@ -430,7 +430,7 @@ namespace Microsoft.AspNet.Mvc.Test
{
// Arrange
var mockHttpContext = new Mock<DefaultHttpContext>();
mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny<Action<object>>(), It.IsAny<object>()));
mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny<IDisposable>()));
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<Action<object>>(), It.IsAny<object>()),
x => x.Response.OnCompletedDispose(It.IsAny<IDisposable>()),
Times.Once());
}
@ -517,7 +517,7 @@ namespace Microsoft.AspNet.Mvc.Test
{
// Arrange
var mockHttpContext = new Mock<DefaultHttpContext>();
mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny<Action<object>>(), It.IsAny<object>()));
mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny<IDisposable>()));
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<Action<object>>(), It.IsAny<object>()),
x => x.Response.OnCompletedDispose(It.IsAny<IDisposable>()),
Times.Once());
}
@ -600,7 +600,7 @@ namespace Microsoft.AspNet.Mvc.Test
{
// Arrange
var mockHttpContext = new Mock<DefaultHttpContext>();
mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny<Action<object>>(), It.IsAny<object>()));
mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny<IDisposable>()));
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<Action<object>>(), It.IsAny<object>()),
x => x.Response.OnCompletedDispose(It.IsAny<IDisposable>()),
Times.Once());
}
@ -694,7 +694,7 @@ namespace Microsoft.AspNet.Mvc.Test
{
// Arrange
var mockHttpContext = new Mock<DefaultHttpContext>();
mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny<Action<object>>(), It.IsAny<object>()));
mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny<IDisposable>()));
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<DefaultHttpContext>();
mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny<Action<object>>(), It.IsAny<object>()));
mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny<IDisposable>()));
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<Action<object>>(), It.IsAny<object>()),
x => x.Response.OnCompletedDispose(It.IsAny<IDisposable>()),
Times.Once());
}
@ -785,7 +785,7 @@ namespace Microsoft.AspNet.Mvc.Test
{
// Arrange
var mockHttpContext = new Mock<DefaultHttpContext>();
mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny<Action<object>>(), It.IsAny<object>()));
mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny<IDisposable>()));
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<Action<object>>(), It.IsAny<object>()),
x => x.Response.OnCompletedDispose(It.IsAny<IDisposable>()),
Times.Once());
}
@ -840,7 +840,7 @@ namespace Microsoft.AspNet.Mvc.Test
{
// Arrange
var mockHttpContext = new Mock<DefaultHttpContext>();
mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny<Action<object>>(), It.IsAny<object>()));
mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny<IDisposable>()));
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<Action<object>>(), It.IsAny<object>()),
x => x.Response.OnCompletedDispose(It.IsAny<IDisposable>()),
Times.Once());
}
@ -1053,7 +1053,7 @@ namespace Microsoft.AspNet.Mvc.Test
{
// Arrange
var mockHttpContext = new Mock<DefaultHttpContext>();
mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny<Action<object>>(), It.IsAny<object>()));
mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny<IDisposable>()));
var controller = new TestableController()
{
@ -1068,7 +1068,7 @@ namespace Microsoft.AspNet.Mvc.Test
Assert.IsType<JsonResult>(result);
Assert.Same(input, result.Value);
mockHttpContext.Verify(
x => x.Response.OnResponseCompleted(It.IsAny<Action<object>>(), It.IsAny<object>()),
x => x.Response.OnCompletedDispose(It.IsAny<IDisposable>()),
Times.Once());
}
@ -1077,7 +1077,7 @@ namespace Microsoft.AspNet.Mvc.Test
{
// Arrange
var mockHttpContext = new Mock<DefaultHttpContext>();
mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny<Action<object>>(), It.IsAny<object>()));
mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny<IDisposable>()));
var controller = new TestableController()
{
@ -1093,7 +1093,7 @@ namespace Microsoft.AspNet.Mvc.Test
Assert.IsType<JsonResult>(result);
Assert.Same(input, result.Value);
mockHttpContext.Verify(
x => x.Response.OnResponseCompleted(It.IsAny<Action<object>>(), It.IsAny<object>()),
x => x.Response.OnCompletedDispose(It.IsAny<IDisposable>()),
Times.Once());
}

View File

@ -150,7 +150,7 @@ namespace Microsoft.AspNet.Mvc
var contentType = "text/html";
var fileName = "Created.html";
var mockHttpContext = new Mock<DefaultHttpContext>();
mockHttpContext.Setup(x => x.Response.OnResponseCompleted(It.IsAny<Action<object>>(), It.IsAny<object>()));
mockHttpContext.Setup(x => x.Response.OnCompletedDispose(It.IsAny<IDisposable>()));
var controller = new TestabilityController()
{
ActionContext = new ActionContext(mockHttpContext.Object, new RouteData(), new ActionDescriptor())

View File

@ -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]

View File

@ -13,15 +13,7 @@ namespace FiltersWebSite
{
public class BasicAuthenticationHandler : AuthenticationHandler<BasicOptions>
{
protected override void ApplyResponseChallenge()
{
}
protected override void ApplyResponseGrant()
{
}
protected override AuthenticationTicket AuthenticateCore()
public override Task<AuthenticationTicket> 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));
}
}
}

View File

@ -10,7 +10,7 @@ namespace FiltersWebSite
{
public class ManagerHandler : AuthorizationHandler<OperationAuthorizationRequirement>
{
public override void Handle(AuthorizationContext context, OperationAuthorizationRequirement requirement)
protected override void Handle(AuthorizationContext context, OperationAuthorizationRequirement requirement)
{
if (context.User.HasClaim("Manager", "yes"))
{

View File

@ -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");