diff --git a/src/Microsoft.AspNetCore.Mvc.TagHelpers/FormTagHelper.cs b/src/Microsoft.AspNetCore.Mvc.TagHelpers/FormTagHelper.cs index b37369bbd4..d9907d99fc 100644 --- a/src/Microsoft.AspNetCore.Mvc.TagHelpers/FormTagHelper.cs +++ b/src/Microsoft.AspNetCore.Mvc.TagHelpers/FormTagHelper.cs @@ -242,7 +242,15 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers } TagBuilder tagBuilder = null; - if (Action == null && Controller == null && Route == null && _routeValues == null && Fragment == null && Area == null && Page == null) + if (Action == null && + Controller == null && + Route == null && + _routeValues == null && + Fragment == null && + Area == null && + Page == null && + // Antiforgery will sometime be set globally via TagHelper Initializers, verify it was provided in the cshtml. + !context.AllAttributes.ContainsName(AntiforgeryAttributeName)) { // Empty form tag such as
. Let it flow to the output as-is and only handle anti-forgery. } diff --git a/test/Microsoft.AspNetCore.Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Form.html b/test/Microsoft.AspNetCore.Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Form.html index 24c01c7601..8529081f48 100644 --- a/test/Microsoft.AspNetCore.Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Form.html +++ b/test/Microsoft.AspNetCore.Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Form.html @@ -1,4 +1,4 @@ - + Form @@ -8,6 +8,7 @@

Form Tag Helper Test

+
diff --git a/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/FormTagHelperTest.cs b/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/FormTagHelperTest.cs index aaea09b846..03fde2f5b4 100644 --- a/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/FormTagHelperTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/FormTagHelperTest.cs @@ -25,6 +25,60 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers { public class FormTagHelperTest { + [Fact] + public async Task ProcessAsync_AspAntiforgeryAloneGeneratesProperFormTag() + { + // Arrange + var expectedTagName = "form"; + var metadataProvider = new TestModelMetadataProvider(); + var tagHelperContext = new TagHelperContext( + tagName: "form", + allAttributes: new TagHelperAttributeList() + { + { "asp-antiforgery", true } + }, + items: new Dictionary(), + uniqueId: "test"); + var output = new TagHelperOutput( + expectedTagName, + attributes: new TagHelperAttributeList(), + getChildContentAsync: (useCachedResult, encoder) => + { + var tagHelperContent = new DefaultTagHelperContent(); + tagHelperContent.SetContent("Something"); + return Task.FromResult(tagHelperContent); + }); + var urlHelper = new Mock(); + var htmlGenerator = new TestableHtmlGenerator(metadataProvider, urlHelper.Object); + var viewContext = TestableHtmlGenerator.GetViewContext( + model: null, + htmlGenerator: htmlGenerator, + metadataProvider: metadataProvider); + viewContext.HttpContext.Request.Path = "/home/index"; + var expectedPostContent = HtmlContentUtilities.HtmlContentToString( + htmlGenerator.GenerateAntiforgery(viewContext), + HtmlEncoder.Default); + var formTagHelper = new FormTagHelper(htmlGenerator) + { + ViewContext = viewContext, + Antiforgery = true, + }; + + // Act + await formTagHelper.ProcessAsync(tagHelperContext, output); + + // Assert + Assert.Equal(2, output.Attributes.Count); + var attribute = Assert.Single(output.Attributes, attr => attr.Name.Equals("method")); + Assert.Equal("post", attribute.Value); + attribute = Assert.Single(output.Attributes, attr => attr.Name.Equals("action")); + Assert.Equal("/home/index", attribute.Value); + Assert.Empty(output.PreContent.GetContent()); + Assert.True(output.Content.GetContent().Length == 0); + Assert.Equal(expectedPostContent, output.PostContent.GetContent()); + Assert.Equal(expectedTagName, output.TagName); + } + [Fact] public async Task ProcessAsync_EmptyHtmlStringActionGeneratesAntiforgery() { diff --git a/test/WebSites/HtmlGenerationWebSite/Views/HtmlGeneration_Home/Form.cshtml b/test/WebSites/HtmlGenerationWebSite/Views/HtmlGeneration_Home/Form.cshtml index 7d159b6d86..93db6801a8 100644 --- a/test/WebSites/HtmlGenerationWebSite/Views/HtmlGeneration_Home/Form.cshtml +++ b/test/WebSites/HtmlGenerationWebSite/Views/HtmlGeneration_Home/Form.cshtml @@ -11,6 +11,7 @@

Form Tag Helper Test

+