如何在 ASP .NET MVC 中使用 Azure AD 凭据长时间不活动后处理 CryptographicException?
How to handle CryptographicException after long inactivity in ASP .NET MVC with Azure AD credentials?
我正在使用包含用户数据和凭据的 Azure Active Directory 应用程序。我使用 Microsoft.Azure.ActiveDirectory.GraphClient 库使用此凭据访问 ASP .NET MVC 5 应用程序。长时间不活动后,大约 20 分钟,点击一些 link 我得到了普通的服务器运行时错误,无法刷新页面并再次登录。只有清除 cookie 有效。
我尝试了什么:
- 使用 customErrors 处理此错误 - 似乎不起作用
- 抓住它:
protected void Application_Error(object sender, EventArgs e)
{
var error = Server.GetLastError();
var cryptoEx = error as CryptographicException;
if (cryptoEx != null)
{
FederatedAuthentication.WSFederationAuthenticationModule.SignOut();
Server.ClearError();
HttpContext.Current.Response.Redirect("~/");
}
}
如此处所述:Federated Authentication on Azure
- 在我使用调试器和本地计算机时不存在问题,仅在生产环境中存在 - 它取决于 IIS 配置吗?
- 我可以将 Azure AD cookie 的 sessionTimeout 更改为每次都等待 20 分钟吗?
- 我应该使用 'static' 机器密钥 - 不是每次都由 Azure AD 生成吗?
我终于做了一个解决方法:我没有处理这个讨厌的异常,而是让会话与 javascript 调用控制器并设置一些 Session["Value"]
的预定请求保持同步
我还通过确保我的页面每 30 分钟刷新一次来解决这个问题。
这可以在 HTML 中通过添加元标记来完成
<meta http-equiv="refresh" content="1800">
也可以通过Javascript
完成
setInterval(function() {
window.location.reload();
}, 180000);
我正在使用包含用户数据和凭据的 Azure Active Directory 应用程序。我使用 Microsoft.Azure.ActiveDirectory.GraphClient 库使用此凭据访问 ASP .NET MVC 5 应用程序。长时间不活动后,大约 20 分钟,点击一些 link 我得到了普通的服务器运行时错误,无法刷新页面并再次登录。只有清除 cookie 有效。
我尝试了什么:
- 使用 customErrors 处理此错误 - 似乎不起作用
- 抓住它:
protected void Application_Error(object sender, EventArgs e)
{
var error = Server.GetLastError();
var cryptoEx = error as CryptographicException;
if (cryptoEx != null)
{
FederatedAuthentication.WSFederationAuthenticationModule.SignOut();
Server.ClearError();
HttpContext.Current.Response.Redirect("~/");
}
}
如此处所述:Federated Authentication on Azure
- 在我使用调试器和本地计算机时不存在问题,仅在生产环境中存在 - 它取决于 IIS 配置吗?
- 我可以将 Azure AD cookie 的 sessionTimeout 更改为每次都等待 20 分钟吗?
- 我应该使用 'static' 机器密钥 - 不是每次都由 Azure AD 生成吗?
我终于做了一个解决方法:我没有处理这个讨厌的异常,而是让会话与 javascript 调用控制器并设置一些 Session["Value"]
我还通过确保我的页面每 30 分钟刷新一次来解决这个问题。
这可以在 HTML 中通过添加元标记来完成
<meta http-equiv="refresh" content="1800">
也可以通过Javascript
完成setInterval(function() {
window.location.reload();
}, 180000);