代码之家  ›  专栏  ›  技术社区  ›  dharmatech

从C生成有效的_RequestVerificationToken#

  •  0
  • dharmatech  · 技术社区  · 6 年前

    关于ASP最受欢迎的书籍之一。NET Core是Adam Freeman的“Pro ASP.NET Core 3”。

    在第7-11章中,他构建了一个示例应用程序SportsStore。

    enter image description here

    如您所见,清单中的每个产品都有自己的“添加到购物车”按钮:

    enter image description here

    如果我们在这个页面上“查看源代码”,我们将在产品列表中看到该项目的以下HTML:

    <div class="card card-outline-primary m-1 p-1">
    
        <div class="bg-faded p-1">
            <h4>
                Kayak
    
                <span class="badge badge-pill badge-primary" style="float:right">
                    <small>$275.00</small>
                </span>
            </h4>
        </div>
    
        <form id="1" method="post" action="/Cart">
    
            <input type="hidden" data-val="true" data-val-required="The ID field is required." id="ID" name="ID" value="1" />
    
            <input type="hidden" name="returnUrl" value="/" />
    
            <span class="card-text p-1">
                
                A boat for one person
    
                <button type="submit" class="btn btn-success btn-sm pull-right" style="float:right">
                    Add To Cart
                </button>
    
            </span>
    
        <input name="__RequestVerificationToken" type="hidden" value="CfDJ8KKqNOS0gwdMvC0-bdjTwWlvCcBJldeidwIX5b2f24gYblS9X1sqCwJWIEsKKOSf8kut0SQsQRLF3R1XBSYZkPGnta9YzRK4tcQl8dq_0uWmjeUhm8yMe90fWDt_x0smmAD1lmb9-BxQF8y_7-IQSz4" /></form>
    
    </div>
    

    注意 input 标签朝向底部:

    <input name="__RequestVerificationToken" type="hidden" value="CfDJ8KKqNOS0gwdMvC0-bdjTwWlvCcBJldeidwIX5b2f24gYblS9X1sqCwJWIEsKKOSf8kut0SQsQRLF3R1XBSYZkPGnta9YzRK4tcQl8dq_0uWmjeUhm8yMe90fWDt_x0smmAD1lmb9-BxQF8y_7-IQSz4" />
    

    如果我们看看 Views\Shared\ProductSummary.cshtml 文件中,我们将看到生成这些列表项所涉及的代码:

    @model Product
    
    <div class="card card-outline-primary m-1 p-1">
    
        <div class="bg-faded p-1">
            <h4>
                @Model.Name
    
                <span class="badge badge-pill badge-primary" style="float:right">
                    <small>@Model.Price.ToString("c")</small>
                </span>
            </h4>
        </div>
    
        <form id="@Model.ID" asp-page="/Cart" method="post">
    
            <input type="hidden" asp-for="ID" />
    
            <input type="hidden" name="returnUrl" value="@ViewContext.HttpContext.Request.PathAndQuery()" />
    
            <span class="card-text p-1">
                
                @Model.Description
    
                <button type="submit" class="btn btn-success btn-sm pull-right" style="float:right">
                    Add To Cart
                </button>
    
            </span>
    
        </form>
    
    </div>
    

    正如你所看到的 form 在本例中,元素没有显式包含 输入 贴上标签 __RequestVerificationToken 价值这 类型 因此,它似乎是一个标记助手,负责生成 输入 贴上标签 __RequestVerificationToken 代币

    作为一个实验,让我们假设我添加了以下方法 Controllers\HomeController :

    [HttpGet]
    public ContentResult ButtonExample()
    {
        var token = "...";
    
        return new ContentResult()
        {
            ContentType = "text/html",
            StatusCode = (int)HttpStatusCode.OK,
            Content =
    
                String.Format(
    
                    @"<!DOCTYPE html>
    
                    <html>
                        <body>
                            <form id=""1"" method=""post"" action=""/Cart"">
    
                                <input type=""hidden"" data-val=""true"" id=""ID"" name=""ID"" value=""1"" />
                            
                                <button type=""submit"">Add to Cart</button>
                            
                            </form>
    
                            <input name=""__RequestVerificationToken"" type=""hidden"" value=""{0}"" />
                        </body>
                    </html>",
    
                    token)
    
        };
    }
    

    如您所见,这将生成一个非常简单的页面,其中有一个按钮,用于将ID值为1的产品(即Kayak)添加到购物车中。

    我当然需要为 __RequestVerificationToken .

    我的问题是,有没有办法从C#得到这个值,这样我就可以把它包含在上面的方法中?

    如上所示的想法是在这里设置令牌值:

    var token = "...";
    

    然后将其插入到使用 String.Format .


    使现代化

    This page 提到以下内容:

    要生成反XSRF令牌,请调用@Html。从MVC视图或@AntiForgery中查看AntiForgeryToken方法。从Razor页面获取HTML()。

    所以我想问题是,我们如何直接从C#而不是从MVC视图或Razor页面进行等效?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Rod Talingting    6 年前

    您可以将下面的代码添加到表单中,该表单将生成 __RequestVerificationToken 。它用于防止CSRF攻击 Prevent XSRF/CSRF attacks .

    <form action="/" method="post">
        @Html.AntiForgeryToken()
    </form>
    
    推荐文章