// 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; using System.IO; using System.Text.Encodings.Web; using Microsoft.AspNetCore.Antiforgery; using Microsoft.AspNetCore.Html; using Microsoft.AspNetCore.Http; namespace Microsoft.AspNetCore.Mvc.ViewFeatures { public static class AntiforgeryExtensions { /// /// Generates an <input type="hidden"> element for an antiforgery token. /// /// The instance. /// The associated with the current request. /// /// A containing an <input type="hidden"> element. This element should be put /// inside a <form>. /// /// /// This method has a side effect: /// A response cookie is set if there is no valid cookie associated with the request. /// public static IHtmlContent GetHtml(this IAntiforgery antiforgery, HttpContext httpContext) { if (antiforgery == null) { throw new ArgumentNullException(nameof(antiforgery)); } if (httpContext == null) { throw new ArgumentNullException(nameof(httpContext)); } var tokenSet = antiforgery.GetAndStoreTokens(httpContext); return new InputContent(tokenSet); } private class InputContent : IHtmlContent { private readonly string _fieldName; private readonly string _requestToken; public InputContent(AntiforgeryTokenSet tokenSet) { _fieldName = tokenSet.FormFieldName; _requestToken = tokenSet.RequestToken; } // Though _requestToken normally contains only US-ASCII letters, numbers, '-', and '_', must assume the // IAntiforgeryTokenSerializer implementation has been overridden. Similarly, users may choose a // _fieldName containing almost any character. public void WriteTo(TextWriter writer, HtmlEncoder encoder) { writer.Write(""); } } } }