我有一个使用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.我正在寻找有关如何诊断这一点的任何建议.到目前为止我尝试过的事情:
任何意见,将不胜感激.
Gar*_*ger 15
这通常是由应用程序无法解密身份验证令牌cookie引起的.确保拥有应用程序池的标识具有足够的权限来访问您的证书存储区.尝试更改身份NetworkService,看看是否有帮助.
您还应该清除浏览器的cookie,以确保您没有来自缓存的其他应用程序的cookie.
该问题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之外,不确定还能做些什么来处理它.任何帮助都被高度赞赏!!! 谢谢!亚历克斯
| 归档时间: |
|
| 查看次数: |
38904 次 |
| 最近记录: |