Microsoft.IdentityModel:密钥无法在指定状态下使用

Bri*_*ams 11 cryptography wif

我有一个使用Windows Identity Foundation的声明感知Web应用程序,除了在一台服务器上运行良好.我在事件日志中看到如下所示的错误消息.

Exception information: 
    Exception type: CryptographicException 
    Exception message: Key not valid for use in specified state.

   at System.Security.Cryptography.ProtectedData.Unprotect(Byte[] encryptedData, Byte[] optionalEntropy, DataProtectionScope scope)
   at Microsoft.IdentityModel.Web.ProtectedDataCookieTransform.Decode(Byte[] encoded)
Run Code Online (Sandbox Code Playgroud)

此应用程序使用非常标准的WIF实现与ADFS v2.它没有使用RsaEncryptionCookieTransform.我正在寻找有关如何诊断这一点的任何建议.到目前为止我尝试过的事情:

  1. 应用程序池使用ASP.NET v4.0标识,其"加载用户配置文件"设置设置为true.
  2. 我删除了C:\ Users\ASP.NET v4.0\AppData文件夹,看到它已成功重新创建.
  3. 我检查了证书私钥的权限,这很好.我也试过禁用令牌加密,这没有任何区别.

任何意见,将不胜感激.

Gar*_*ger 15

这通常是由应用程序无法解密身份验证令牌cookie引起的.确保拥有应用程序池的标识具有足够的权限来访问您的证书存储区.尝试更改身份NetworkService,看看是否有帮助.

您还应该清除浏览器的cookie,以确保您没有来自缓存的其他应用程序的cookie.


Ale*_*sov 7

该问题100%可重复:

实际上,在重新部署应用程序之后,旧的身份验证cookie留在客户端计算机上(客户端没有签出) - 在客户端发出任何后续请求时都会出现此错误.要修复此错误,客户端必须删除cookie和/或登录,然后从STS注销.一旦完成 - 错误消失,一切都很好,直到下次升级....

经过一些研究,我认为这是SessionAuthenticationModule中需要修复的错误.如果仔细查看上面的堆栈跟踪,有一个名为TryReadSessionTokenFromCookie的有趣方法,它设置了认证模块将"尝试"从cookie读取令牌的期望,如果失败则返回false - 这是代码(感谢ReSharper的)!

public bool TryReadSessionTokenFromCookie(out SessionSecurityToken sessionToken)
{
    byte[] sessionCookie = this.CookieHandler.Read();
    if (sessionCookie == null)
    {
        sessionToken = null;
        return false;
    }
    sessionToken = this.ReadSessionTokenFromCookie(sessionCookie);
    if (DiagnosticUtil.TraceUtil.ShouldTrace(TraceEventType.Verbose))
    {
        DiagnosticUtil.TraceUtil.Trace(TraceEventType.Verbose, TraceCode.Diagnostics, SR.GetString("TraceValidateToken", new object[0]), new TokenTraceRecord(sessionToken), null);
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

显然,代码在此方法中失败,出现未处理的错误,并且开发人员没有任何选项以或多或少的合理方式处理错误.(...或者至少我找不到任何东西,因为这个HTTP模块没有将此错误传递给HttpApplication对象进行处理,并将其抛出用户的脸.)所以,我认为有两个错误:1)安全令牌处理程序需要更具体地说明抛出ID1073的原因(服务器端解密错误或错误(旧)cookie错误)2)必须有一种方法让开发人员处理此错误并注销用户(如果发生) .我将对此进行任何帮助...任何人都可以创建一个示例代码,显示如何拦截此异常,以便在发生此错误时用户可以自动注销?同样,Application.Error事件似乎没有从这个模块中被触发 - 除了编写我自己的SessionAuthenticationModule之外,不确定还能做些什么来处理它.任何帮助都被高度赞赏!!! 谢谢!亚历克斯

  • @achekh我很尴尬你是如何实现ResetAuthentication的?你能否分享一下这个实现!谢谢! (5认同)