CryptographicException: 在加密操作期间发生错误 : 如何自动修复它?

10 浏览
0 Comments

CryptographicException: 在加密操作期间发生错误 : 如何自动修复它?

这是我的Global.ascx.cs文件,其中包含FormsAuthentication

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
    protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
    {
        HttpCookie authCookie = Request.Cookies["CookieFA"];
        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            CustomPrincipal principal = new CustomPrincipal(authTicket.Name);
            CustomPrincipalSerializeModel userSerializeModel = JsonConvert.DeserializeObject(authTicket.UserData);
            principal.UserID = userSerializeModel.ID;
            principal.FirstName = userSerializeModel.FirstName;
            principal.LastName = userSerializeModel.LastName;
            principal.Roles = userSerializeModel.RoleName.ToArray();
            HttpContext.Current.User = principal;
        }
    }
    protected void Application_Error(object sender, EventArgs e)
    {
        Exception exception = Server.GetLastError();
        if (exception is CryptographicException)
        {
            FormsAuthentication.SignOut();
            Session.Abandon();
            // 清除身份验证 cookie
            HttpCookie cookie1 = new HttpCookie("CookieFA", "");
            cookie1.Expires = DateTime.Now.AddYears(-1);
            Response.Cookies.Add(cookie1);
            // 清除会话 cookie(对于当前问题不是必需的,但我建议您仍然这样做)
            SessionStateSection sessionStateSection = (SessionStateSection)WebConfigurationManager.GetSection("system.web/sessionState");
            HttpCookie cookie2 = new HttpCookie(sessionStateSection.CookieName, "");
            cookie2.Expires = DateTime.Now.AddYears(-1);
            Response.Cookies.Add(cookie2);
            FormsAuthentication.RedirectToLoginPage();
        }
    }
}

但是即使有了Application_Error方法,我经常遇到这个错误:

[CryptographicException: 在进行加密操作期间发生错误。]
   System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.HomogenizeErrors(Func`2 func, Byte[] input) +115
   System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.Unprotect(Byte[] protectedData) +70
   System.Web.Security.FormsAuthentication.Decrypt(String encryptedTicket) +9778338
   GPMS.MvcApplication.Application_PostAuthenticateRequest(Object sender, EventArgs e) in C:\repos\GPMS\GPMS\Global.asax.cs:32
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +141
   System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +48
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +71

已经尝试了一些写在这里建议的解决方法,但无法解决问题。

我没有使用Azure。我不想使用“删除 cookie 就一切正常”的解决方案:无法强制用户删除 cookie。系统必须自动执行此操作。

我应该在哪里修复它?也许我在全局错误处理程序中遗漏了一些东西?

看起来Application_Error可能没有被调用?

0
0 Comments

在处理加密异常时,可以参考以下方法来处理无法解密的cookie:

首先,在获取cookie时,首先检查是否存在cookie,如果不存在,则返回null。如果存在,然后尝试使用FormsAuthentication.Decrypt方法来解密cookie的值。如果解密过程中出现CryptographicException异常,则记录错误日志,并返回null。

其次,在Application_PostAuthenticateRequest事件中,获取解密后的认证票据。如果票据不为null,则创建CustomPrincipal对象,并根据票据中的用户数据,设置CustomPrincipal对象的属性值。最后,将HttpContext.Current.User设置为创建的CustomPrincipal对象。

此外,还需要对异常的原因进行调查,例如检查机器密钥是否在每个应用程序池回收后都发生了变化。

根据以上方法,可以尝试移除Application_Error方法。

0