asp.net-mvc-4 - .NET MVC4 SimpleMembership 错误 - "No user found was found that has the name xxx"

标签 asp.net-mvc-4 simplemembership

我在 .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/

相关文章:

c# - HostingEnvironment.QueueBackgroundWorkItem 永远不会在 azure 部署的 asp.net mvc 4.5 应用程序上执行

entity-framework - 将 SimpleMembership 与 Entity Framework 集成

asp.net-mvc - SimpleMembership 与 SQL Server Compact (SDF) - 使用现有数据库进行代码优先

authentication - ASP.Net MVC 4 简单成员资格指定架构

asp.net-mvc - 检测用户 session 超时时刻并执行方法

asp.net-mvc - SimpleMembership 的 IsUserInRole 错误

javascript - 我无法设置在 jquery 中选中的 MVC 复选框

entity-framework-4 - 可以从 View 中使用 `System.Data.Objects.SqlClient.SqlFunctions` 吗?

c# - Json.net 在 Web API 中使用,但在 Razor 模板中调用 Json.Encode 时不使用

asp.net - AutoMapper 好用吗?