ASP网站在Web.Config中似乎没有使用machineKey进行FormsAuthentication.Decrypt操作

4
我希望能够将我的ASP.Net MVC 5(.Net 4.5.1,在iisexpress本地托管,从Visual Studio运行)中的身份验证cookie传递给我的WCF服务(.Net 4.5.1,在同一Visual Studio解决方案中从WcfSvcHost本地托管),并在那里进行解密。我已经配置了两个应用程序使用相同的机器密钥(在ASP的Web.config文件和WCF的App.config文件中)。
<machineKey validationKey="930681CA8CDC1BC09118D6B37E4A1B7712CEDBBD9FA1E35407EA1CD440C7E6F2DB9E93DADAC4098F90ACC7417DBE57C196722FC67F313A6AAE0F946E2FF731B6" decryptionKey="714C9581DA522C636B2D97D80276D5ACC02C274A11ABF117C76181B0480D4AEA" validation="SHA1" decryption="AES" />

两个引用都指向同一个System.Web.dll:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.Web.dll (v4.0.30319)

但是当我试图将cookieString传递给我的服务并调用它时,出现了问题。

FormsAuthenticationTicket tick = FormsAuthentication.Decrypt(cookieString);

我遇到了以下错误:

无法验证数据

我尝试了另一种方式(在WCF服务上生成一个虚假的票证,然后在ASP网站上解密),但也没有成功。 我可以在ASP网站上生成并解密票证。 我也可以在服务上生成并解密票证,没有任何问题。
var t1 = new FormsAuthenticationTicket("foo", false, 1337);
var cookie = FormsAuthentication.Encrypt(t1);
var t2 = FormsAuthentication.Decrypt(cookie);

我还制作了一个小的控制台应用程序,在那里创建了一张票据,并在 WCF 服务上解密它,没有出现任何问题。
因此,似乎 ASP 网站未使用指定的密钥来加密或解密数据。
有人知道我该怎么做来解决这个问题吗?
编辑: 我按照这篇指南获取了 cookie 并将其传递给了我的服务。 http://thoughtorientedarchitecture.blogspot.de/2009/10/flowing-aspnet-forms-authentication.html 然而,就像我说的,我尝试复制加密 cookie 的值,并在具有相同机器密钥的简单控制台应用程序中进行解密,但却不起作用。

不,我不想传递任何用户数据。我的问题是,当我将加密字符串传递给任何不是它来自的 ASP 网站的其他应用程序时,我无法解密 cookie。 - wertzui
3个回答

11
您还在http://forums.asp.net/p/1956219/5581762.aspx上提出了同样的问题。请参考我在那里的答案:

在WCF服务中,设置<machineKey ... compatibilityMode="Framework45" />。这将导致它使用与ASP.NET相同的算法。

(还要记得更改机器密钥,如果您不小心复制并粘贴了真实的密钥到上述问题中。)


2
我尝试了这个,现在我收到以下错误:"在加密操作期间发生错误。" Stacktrace 如下: 在 System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.HomogenizeErrors(Func`2 func, Byte[] input), 在 System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.Unprotect(Byte[] protectedData), 在 System.Web.Security.FormsAuthentication.Decrypt(String encryptedTicket)。 - wertzui

2

Levi在这里回答了我的问题:http://forums.asp.net/t/1956219.aspx

添加<httpRuntime targetFramework="4.5" />将推断出compatibilityMode="Framework45"到machineKey部分。

因此,要修复此错误,请在machineKey部分中添加compatibilityMode="Framework45"或在ASP网站的web.config的system.web部分中添加<httpRuntime targetFramework="4.5" />。


顺便提一下,MVC 5项目模板应该自动在Web.config中包含httpRuntime/targetFramework=4.5,因为这是MVC 5正确运行所必需的。这就是为什么我没有立即怀疑它是根本原因的原因。 - Levi
我最初是使用VS 2013 RC创建的该项目,也许这就是为什么它被包含进去的原因。 - wertzui
5
为什么你没有将Levi的回答标记为答案?你基本上只是复制了他的回答并进行了回答。 - eduncan911

1
我认为你应该做类似于以下的事情:

var authCookie = FormsAuthentication.GetAuthCookie(userName, rememberUser.Checked);
// Get the FormsAuthenticationTicket out of the encrypted cookie
var ticket = FormsAuthentication.Decrypt(authCookie.Value);
// Create a new FormsAuthenticationTicket that includes our custom User Data
var newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, "userData");
// Update the authCookie's Value to use the encrypted version of newTicket
authCookie.Value = FormsAuthentication.Encrypt(newTicket);

我尝试了这个,但它没有起作用,我得到了相同的错误。我也不明白为什么需要创建一个新的Ticket并嵌入“userData”。我认为只使用从FormsAuthentication.GetAuthCookie(...)获得的authCookie就足够了。 - wertzui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接