React to Http/AuthNZ changes
This commit is contained in:
parent
a3cbb1f378
commit
7c426f7835
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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"))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
Loading…
Reference in New Issue