我在 .NET MVC4 项目中使用 SimpleMembership。在开发过程中,在手动操作/重建数据库时,我遇到了一个在生产中不太可能出现的错误,但我想解决这个问题,但找不到一种优雅的方法来处理它。
如果登录应用程序后,您的用户名在数据库中发生更改,或者您的用户记录被完全删除,则用户将无法再访问应用程序的任何页面...包括允许匿名的公共(public)页面 View 和登录屏幕。相反,会引发异常 - “未找到名称为“用户名”的用户”。
我的应用程序中的所有页面都显示一个部分 View ,该 View 呈现登录/注销控件。无论数据库中有什么内容,Request.IsAuthenticated 都会返回 true。看来应用程序根据cookie中的信息认为用户仍然登录,但在数据库中找不到相应的记录。清除身份验证 cookie 可以解决此问题,但这不是我想向可能遇到此问题的用户提供的说明。
我当前的解决方案是在 Global.asax 中捕获该异常,清除 cookie,然后重定向到登录页面。这对我来说似乎完全是黑客行为。
有没有人对这种情况有更好的解决方案?我从未在使用旧的 .NET 成员(member)资格提供程序时遇到过这样的问题...我的期望是这种情况应该立即涵盖,并且我不应该考虑它...如果记录被更改/在数据库中删除,用户应该会失败授权并自动重定向到登录页面。
最佳答案
不确定您的身份验证逻辑首先在哪里,但这是我所做的:
在 Global.asax.cs 中:
protected void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
if (ex.Message.Contains("No user found was found that has the name"))
{
FormsAuthentication.SignOut();
Response.Redirect(Request.RawUrl);
}
}
由于抛出的异常只是一个System.InvalidOperationException
,因此您无能为力。不是很聪明,但还是做了需要做的事情。另外,请确保您重定向到的页面上没有像 IsUserInRole(...)
这样的身份验证逻辑,如果是,那么您可能想将其包装在 try{} catch( ){}
关于asp.net-mvc-4 - .NET MVC4 SimpleMembership 错误 - "No user found was found that has the name xxx",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13654837/