在WebBrowser WPF中查看启用MVC Antiforgery的Web页面

时间:2015-02-19 07:31:32

标签: html asp.net-mvc wpf winforms

我们计划在WPF webbrowser控件中显示基于MVC的网页。但是MVC应用程序是用Antiforgery Token实现的,因此它说我们无法访问该页面。请通过共享解决方法帮助解决任何问题。

1 个答案:

答案 0 :(得分:1)

开箱即用,此方案应该正常工作。使用简单的控制器创建示例应用程序:

public class TestController : Controller
{
    public ActionResult AntiForgery()
    {
        return View();
    }

    [ValidateAntiForgeryToken]
    [HttpPost]
    public ActionResult AntiForgery(ViewModel model)
    {
        return View(model);
    }
}

一个简单的观点:

@model Mvc.Models.ViewModel
@using (Html.BeginForm("AntiForgery", "Home"))
{
    @Html.AntiForgeryToken();
    @Html.EditorFor(m => m.Text)
}

和一个简单的视图模型:

public class ViewModel
{
    public string Text { get; set; }
}

我们可以加载页面,在文本框中输入一些文本,然后看到它返回到AntiForgery操作,并带有ValidateAntiForgeryToken属性。

如果我们使用Window和WebBrowser控件创建一个简单的WPF应用程序:

<Window x:Class="Wpf.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Wpf"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Grid>
    <WebBrowser Name="Browser" />
</Grid>

我们可以在加载时导航到MVC页面:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        this.Browser.Navigate("http://localhost:1166/Test/AntiForgery");
    }
}

和以前一样,我们得到了预期的结果,页面正确地回复了我们的Action。那么为什么它不适合你的情况呢?

很难确切地说,但很可能与cookie有关。您的WPF应用程序必须接受cookie才能使ValidateAntiForgeryToken属性正常工作,并且必须位于HttpPost操作上。 AntiForgeryToken的工作方式是向浏览器发送带有令牌值的cookie,该令牌值也必须与表单中的隐藏输入匹配。

(您可以查看Steve Sanderson's blog post以获得跨站点请求伪造的详细解释,以及如何使用AntiForgeryToken方法来对抗它。)

您可能已经注意到WebBrowser控件与Internet Explorer非常相似(相同的上下文菜单,相同的控件呈现等)。这在某种程度上是正确的,因此,控件在安全设置方面继承了IE的许多行为。

根据您尝试加载的页面的位置,可能会在WebBrowser控件中阻止Cookie。如果您单独处理Internet Explorer,则可以查看安全区域和隐私设置,这些设置允许您控制对cookie的访问。 WPF WebBrowser控件可能继承自这些属性,并且可能值得检查以确定您是否在Internet Explorer中遇到相同的问题。

(有关更改这些设置的详细信息,请go here。)

可能更困难的路线是更改单个应用程序的安全设置,即使默认区域(或区域设置)阻止cookie被保留。 This other StackOverflow question and answer谈论确保Cookie被保留,以便内容只显示几次。虽然与您的问题不完全相同,但确保正确保存Cookie也应该解决您的问题,如果问题是Cookie。

在Web上查找可能出现的其他非安全原因,我发现article on Rick Strahl's blog表示WebBrowser控件的默认设置可能是使用旧的IE渲染引擎,并且至少{{ 3}}建议这些默认设置可能会干扰cookie。

如果问题不是问题,那么您还可以查看其他一些内容。由于令牌与会话绑定,如果用户长时间坐在您的WPF应用程序中,他们的会话可能会过期。在这种情况下,页面将无法正确验证。同样,如果托管站点的应用程序池被回收或重置IIS,这也可能导致会话结束,从而也无法验证。

最后,如果没有更多信息,很难确切地知道什么阻止令牌被正确验证,但这些至少是你可以尝试的一些事情。