diff --git a/src/Microsoft.AspNetCore.Mvc.Core/RequireHttpsAttribute.cs b/src/Microsoft.AspNetCore.Mvc.Core/RequireHttpsAttribute.cs index 40975dd211..b3c34a1a96 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/RequireHttpsAttribute.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/RequireHttpsAttribute.cs @@ -15,6 +15,12 @@ namespace Microsoft.AspNetCore.Mvc [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] public class RequireHttpsAttribute : Attribute, IAuthorizationFilter, IOrderedFilter { + /// + /// Specifies whether a permanent redirect, 301 Moved Permanently, + /// should be used instead of a temporary redirect, 302 Found. + /// + public bool Permanent { get; set; } + /// public int Order { get; set; } @@ -84,7 +90,7 @@ namespace Microsoft.AspNetCore.Mvc request.QueryString.ToUriComponent()); // redirect to HTTPS version of page - filterContext.Result = new RedirectResult(newUrl, permanent: false); + filterContext.Result = new RedirectResult(newUrl, Permanent); } } } diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/RequireHttpsAttributeTests.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/RequireHttpsAttributeTests.cs index 713b58e3cc..1480c9102d 100644 --- a/test/Microsoft.AspNetCore.Mvc.Core.Test/RequireHttpsAttributeTests.cs +++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/RequireHttpsAttributeTests.cs @@ -191,6 +191,27 @@ namespace Microsoft.AspNetCore.Mvc Assert.Equal(expectedUrl, result.Url); } + [Theory] + [InlineData(true)] + [InlineData(false)] + public void OnAuthorization_RedirectsToHttpsEndpoint_WithSpecifiedStatusCode(bool permanent) + { + var requestContext = new DefaultHttpContext(); + requestContext.RequestServices = CreateServices(); + requestContext.Request.Scheme = "http"; + requestContext.Request.Method = "GET"; + + var authContext = CreateAuthorizationContext(requestContext); + var attr = new RequireHttpsAttribute { Permanent = permanent }; + + // Act + attr.OnAuthorization(authContext); + + // Assert + var result = Assert.IsType(authContext.Result); + Assert.Equal(permanent, result.Permanent); + } + private class CustomRequireHttpsAttribute : RequireHttpsAttribute { protected override void HandleNonHttpsRequest(AuthorizationFilterContext filterContext)