<a href=”http://msdn2.microsoft.com/en-us/library/aa970060.aspx” target=”_blank”>XBAP</a> (XAML browser applications) 是利用 ClickOnce 技术将 WPF 应用程式透过 Web 浏览器加以佈署与使用的型式。由于考量 Internet 应用的安全性,XBAP 预设之安全设定是极为严格的,例如不允许使用 TCP/IP Socket,不允许档案写入,不允许存取下载伺服器以外之 Web 伺服器…,若应用程式需要使用这些能力,则必须将此 XBAP 应用程式设定为 Full Trust Application。
假设我们运用 Visual Studio 2008 开发一个简单的 XBAP 应用程式如下,当按下按钮btnGenerate 后则会写入一个名为 test.txt 的文字档案。
<a href=”http://blogs.msdn.com/blogfiles/tomleetaiwan/WindowsLiveWriter/VisualStudio2008XBAPFullTrustApplication_10459/xbap1_2.jpg” target=”_blank”>
<img src=”http://blogs.msdn.com/blogfiles/tomleetaiwan/WindowsLiveWriter/VisualStudio2008XBAPFullTrustApplication_10459/xbap1_thumb.jpg”>
</a>
程式码动作如下
using System.IO;
…..
private void btnGenerate_Click (object sender, RoutedEventArgs e)
{
try
{
FileInfo FInfo = new FileInfo(“test.txt”);
StreamWriter Tex = FInfo.CreateText();
Tex.WriteLine(“Hello World”);
Tex.WriteLine(“WPF XBAP Demo”);
Tex.Write(Tex.NewLine);
Tex.Close();
TxtResult.Text = “档案建立成功”;
}
catch (Exception ex)
{
TxtResult.Text = “档案建立失败!! (” + ex.Message + “)”;
}
}
当此应用程式于 Visual Studio 2008 环境下执行时,按下按钮便会出现如下安全相关之错误讯息。这是因为 XBAP 预设是不允许写入下载环境档案系统造成的。<a href=”http://blogs.msdn.com/blogfiles/tomleetaiwan/WindowsLiveWriter/VisualStudio2008XBAPFullTrustApplication_10459/xbap2_2.jpg” target=”_blank”>
<img src=”http://blogs.msdn.com/blogfiles/tomleetaiwan/WindowsLiveWriter/VisualStudio2008XBAPFullTrustApplication_10459/xbap2_thumb.jpg”>
</a>
若要让 XBAP 应用程式能够做出写入档案的动作,可以在 Visual Studio 2008 的选单中选取此专案档之 Property,将出现如下图 Security 的页面。在此页面中我们可以看到 Visual Studio 2008 预设是采用 “This is a partial trust application” 的设定,此时我们必须手动点选 “This is a full trust application” 选项。
<a href=”http://blogs.msdn.com/blogfiles/tomleetaiwan/WindowsLiveWriter/VisualStudio2008XBAPFullTrustApplication_10459/xbap3_2.jpg” target=”_blank”>
<img src=”http://blogs.msdn.com/blogfiles/tomleetaiwan/WindowsLiveWriter/VisualStudio2008XBAPFullTrustApplication_10459/xbap3_thumb.jpg”>
</a>
在 Visual Studio 2008 内重新编译后加以执行,按下此 XBAP 应用程式的按钮建立档案,如下图所示,我们便会发现此 XBAP 应用程式已经可以正确执行写入档案的动作了。<a href=”http://blogs.msdn.com/blogfiles/tomleetaiwan/WindowsLiveWriter/VisualStudio2008XBAPFullTrustApplication_10459/xbap5_2.jpg” target=”_blank”>
<img src=”http://blogs.msdn.com/blogfiles/tomleetaiwan/WindowsLiveWriter/VisualStudio2008XBAPFullTrustApplication_10459/xbap5_thumb.jpg”>
</a>
但是 XBAP 佈署的问题尚未完全结束,当我们利用 Visual Studio 2008 的 Publish 功能成功地佈署到同一台 PC 的 Windows Vista II7 的环境后,再透过 Web 浏览器连接 localhost 加以测试,却又发生了 “未授与信任” 的错误讯息。
<a href=”http://blogs.msdn.com/blogfiles/tomleetaiwan/WindowsLiveWriter/VisualStudio2008XBAPFullTrustApplication_10459/xbap6_2.jpg” target=”_blank”>
<img src=”http://blogs.msdn.com/blogfiles/tomleetaiwan/WindowsLiveWriter/VisualStudio2008XBAPFullTrustApplication_10459/xbap6_thumb.jpg”>
</a>
由于此一 XBAP 应用做出许多有可能危及 PC 安全的动作,也因此必须要让使用者信任此一 XBAP 应用程,所谓信任的方式就是使用者必须手动汇入此应用程式之凭证 (Certificate)。这个汇入凭证的动作;在一个良好管理的企业内部网路,可以运用管理工具或 Windows Server Group Policy 自动化达成。但是在 Internet 应用时,只有让使用者自行手动地汇入凭证。
可以在 Visual Studio 2008 的选单中选取此专案档之 Property,接者点选 Singing 页面。倘若我们勾选了Sign the ClickOnce manifests 的 Checkbox,则 Visual Studio 2008 预设便会产生一个与专案同名之 Temporary Key,例如专案名称是 WpfBrowserApplication1 ,临时用的凭证名称就是 WpfBrowserApplication1_TemporaryKey.pfx。这个测试用凭证的详细资讯我们可以按下同一画面中的 More Details 按钮,就会出现如下的画面,告知此凭证的发行者与有效期限。
<a href=”http://blogs.msdn.com/blogfiles/tomleetaiwan/WindowsLiveWriter/VisualStudio2008XBAPFullTrustApplication_10459/xbap7_2.jpg” target=”_blank”>
<img src=”http://blogs.msdn.com/blogfiles/tomleetaiwan/WindowsLiveWriter/VisualStudio2008XBAPFullTrustApplication_10459/xbap7_thumb.jpg”>
</a>
为了让您的 XBAP 或 ClickOnce 应用程式获取更高层级的信任,您必须对每部将会执行应用程式的用户端电脑,将应用程式凭证加入”受信任的发行者”的凭证存放区。如果我们应用程式做数位签章的凭证并非知名的国际机构核发,当然 Microsoft Internet Explorer 内也不会内建于 “信任的根凭证授权”之中。
如下图,我们可以利用 Microsoft Management Console (mmc.exe) 来了解目前安装的凭证资讯,由Microsoft Management Console中我们可以知道,此一临时用之应用程式凭证尚未被汇入 “信任的根凭证授权” (Trusted Root Certification Authorities) 与”受信任的发行者” (Trusted Publishers)。<a href=”http://blogs.msdn.com/blogfiles/tomleetaiwan/WindowsLiveWriter/VisualStudio2008XBAPFullTrustApplication_10459/xbap8_2.jpg” target=”_blank”>
<img src=”http://blogs.msdn.com/blogfiles/tomleetaiwan/WindowsLiveWriter/VisualStudio2008XBAPFullTrustApplication_10459/xbap8_thumb.jpg”>
</a>
回到 Visual Studio 2008 我们可以在专案档之 Property ,接者点选 Singing 页面。按下同一画面中的 More Details 按钮后,我们可以在凭证的对话方块内按下安装按钮。并将此凭证置放到 “受信任的发行者”的凭证存放区。
<a href=”http://blogs.msdn.com/blogfiles/tomleetaiwan/WindowsLiveWriter/VisualStudio2008XBAPFullTrustApplication_10459/xbap9_2.jpg” target=”_blank”>
<img src=”http://blogs.msdn.com/blogfiles/tomleetaiwan/WindowsLiveWriter/VisualStudio2008XBAPFullTrustApplication_10459/xbap9_thumb.jpg”>
</a>
此外也要将此凭证安装到 “信任的根凭证授权”的凭证存放区。
<a href=”http://blogs.msdn.com/blogfiles/tomleetaiwan/WindowsLiveWriter/VisualStudio2008XBAPFullTrustApplication_10459/xbap10_2.jpg” target=”_blank”>
<img src=”http://blogs.msdn.com/blogfiles/tomleetaiwan/WindowsLiveWriter/VisualStudio2008XBAPFullTrustApplication_10459/xbap10_thumb.jpg”>
</a>
接下来再透过 Web 浏览器测试 localhost 便不会再出现 “未授与信任” 的错误讯息了。这类 XBAP 应用程式一旦通过凭证检查并正确执行后,就会被 Cache 在 PC 端存放 ClickOnce Application 的 Cache 内,若想要快速清除 Cache 内的 XBAP 应用程式以便测试凭证相关设定,记得要利用 Windows SDK 内的工具程式 mage.exe,在 Console 模式中下达
mage -cc
即可立即清除 ClickOnce Application Cache 的内容。若是在没有安装 Windows SDK 的用户端环境,则可以在命令列下达
rundll32 %windir%system32dfshim.dll CleanOnlineAppCache
一样可以达到清除 ClickOnce Application Cache 的效果。