C# ASP网站似乎没有在Web.Config中为FormsAuthentication.Decrypt使用machineKey

C# ASP网站似乎没有在Web.Config中为FormsAuthentication.Decrypt使用machineKey,c#,asp.net,wcf,forms-authentication,machinekey,C#,Asp.net,Wcf,Forms Authentication,Machinekey,我想将身份验证cookie从我的ASP.Net MVC 5(.Net 4.5.1,托管在iisexpress上,从Visual Studio运行)传递到我的WCF服务(.Net 4.5.1,托管在WcfSvcHost上,从同一Visual Studio解决方案运行)并在那里解密。 我已将两者配置为使用相同的machinekey(ASP为Web.config,WCF为App.config): 我得到以下错误: 无法验证数据 我尝试了另一种方法(在WCF服务上生成一张假票证,并在ASP网站上解密),

我想将身份验证cookie从我的ASP.Net MVC 5(.Net 4.5.1,托管在iisexpress上,从Visual Studio运行)传递到我的WCF服务(.Net 4.5.1,托管在WcfSvcHost上,从同一Visual Studio解决方案运行)并在那里解密。 我已将两者配置为使用相同的machinekey(ASP为Web.config,WCF为App.config):

我得到以下错误:

无法验证数据

我尝试了另一种方法(在WCF服务上生成一张假票证,并在ASP网站上解密),但也不起作用。 我可以在ASP网站上生成一张票证并在那里解密。 我还可以在服务上生成一张票证,并在那里解密,而不会出现任何问题

var t1 = new FormsAuthenticationTicket("foo", false, 1337);
var cookie = FormsAuthentication.Encrypt(t1);
var t2 = FormsAuthentication.Decrypt(cookie);
我还制作了一个小的控制台应用程序,在那里创建了一个票证,并在WCF服务上对其进行了解密,没有任何问题

var t1 = new FormsAuthenticationTicket("foo", false, 1337);
var cookie = FormsAuthentication.Encrypt(t1);
var t2 = FormsAuthentication.Decrypt(cookie);
因此,ASP网站似乎不使用指定的密钥来加密或解密数据

有人知道我能做些什么来解决这个问题吗

编辑: 我按照此指南获取cookie并将其传递给我的服务。


然而,正如我所说,我试图复制加密cookie的值,并用同一台machinekey在一个简单的控制台应用程序中对其进行解密,但没有成功

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);
你也问过这个问题。请看我的回答:

在WCF服务中,设置。这将导致它使用与ASP.NET相同的算法


(如果您不小心将真实钥匙复制粘贴到上述问题中,请记住更改您的机器钥匙。)

Levi在此处回答了我的问题:

添加将推断machineKey部分的兼容性Mode=“Framework45”


因此,要修复此错误,请将compatibilityMode=“Framework45”添加到machineKey部分,或添加到ASP网站的web.config的system.web部分。

可能重复Nope,我不想传递任何用户数据。我的问题是,当我将加密的字符串传递给任何其他应用程序(它不是来自asp网站)时,我无法解密cookie。我尝试了这个方法,但没有成功,我得到了相同的错误。我也不明白,为什么我需要创建一个新的票证并嵌入“userData”。我以为只要使用我从FormsAuthentication.GetAuthCookie(…)中获得的authCookie就足够了。我尝试了这个,现在我得到了以下错误:“加密操作期间发生错误。”Stacktrace是bei System.Web.Security.Cryptography.MilimizingCryptoServiceWrapper.MilimizerErrors(Func`2 Func,Byte[]input)bei System.Web.Security.Cryptography.均质CryptoServiceWrapper.Unprotect(Byte[]protectedData)bei System.Web.Security.FormsAuthentication.Decrypt(String encryptedTicket)顺便说一句,MVC 5项目模板应该自动在Web.config中包含httpRuntime/targetFramework=4.5,因为MVC 5需要它才能正确运行。这就是为什么我没有立即怀疑这是根本原因。我最初用VS 2013 RC创建了这个项目,也许这就是为什么它被包括在内的原因。为什么你没有在这里标记Levi的答案作为答案?你基本上是把他的答案贴上去,然后回答。
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);