我们计划在WPF webbrowser控件中显示基于MVC的网页。但是MVC应用程序是用Antiforgery Token实现的,因此它说我们无法访问该页面。请通过共享解决方法帮助解决任何问题。
答案 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,这也可能导致会话结束,从而也无法验证。
最后,如果没有更多信息,很难确切地知道什么阻止令牌被正确验证,但这些至少是你可以尝试的一些事情。