MVC 中的两步身份验证?

2024-01-04

我们有一个 MVC 应用程序,它有一个自定义表单身份验证视图/控制器。控制器将验证内容,然后执行 FormsAuthentication.RedirectFromLoginPage 调用。

此时,在 Global.asax 中,我们将收到一个 Application_OnAuthenticateRequest 调用,从中我们将获取其 Context.User 信息,并进行另一个调用以收集与此帐户相关的信息,然后将其存储在其 Context.User 和 System.Threading 中.Thread.CurrentPrincipal。我们还对这些信息进行了一些缓存,因为在我们的系统中检索我们需要的信息的成本很高,这会导致缓存失效并重新检索该信息。

此时我们将它们分成单独的调用似乎有点奇怪。我几乎想知道登录控制器是否不应该收集详细信息作为其身份验证检查的一部分并存储它们。然后,Application_OnAuthenticateRequest 只能担心缓存是否需要失效并重新检索用户详细信息。

或者也许还有其他处理这个问题的方法我什至不知道..?


您可以通过利用 MVC 来做您想做的事情RedirectToRouteResult和自定义缓存更新ActionFilter。这称为 PRG(重定向后获取)模式。实际上您已经在这样做了,但它有点令人困惑,因为您正在做的事情是经典 ASP.NET 做事方式和 MVC 做事方式之间的交叉。您最初的方法没有任何问题(只要它工作正常),但是要做同样的事情并更好地控制和理解它在计划中的工作方式,您可以这样做:

public class AuthenticationController :Controller
{
    [HttpPost]
    public RedirectToRouteResult Login(string username, string password)
    {
        //authenticate user
        //store authentication info in TempData like
        bool authenticated = true|false; // do your testing
        if(authenticated)
        {
            TempData["MustUpdateCache"] = true | false;
            return RedirectToAction("LoginSuccess", new{userId = membershipUser.UserId});                
        }
        else
        {
            TempData["MustUpdateCache"] = true | false;
            return RedirectToAction("Login");
        }
    }

    [HttpGet, UpdateCache]
    public ActionResult LoginSuccess(Guid userId, string url)
    {
        HttpContext.User = LoadUser(userId);
        return View();
    }

    [HttpGet, UpdateCache]
    public ViewResult Login()
    {
        return View();
    }

}
public class UpdateCacheAttribute:ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var tempData = filterContext.Controller.TempData;
        if (tempData.ContainsKey("MustUpdateCache") && (bool)tempData["MustUpdateCache"])
        {
            UpdateCache(filterContext);
        }
    }

    void UpdateCache(ControllerContext controllerContext)
    {
        //update your cache here
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVC 中的两步身份验证? 的相关文章

  • 在asp.net mvc中映射物理文件路径

    我正在尝试从 ASP Net MVC 控制器中的磁盘读取 XSLT 文件 我正在做的事情如下 string filepath HttpContext Request PhysicalApplicationPath filepath Cont
  • ASP.NET MVC 2 Preview 2 - 显示目录列表而不是 home/index

    我只是下载 ASP NET MVC 2 Preview 2 创建一个新项目并运行它 但为什么它显示目录列表而不是默认页面 我使用的是 VS2008 SP1 并安装了 ASP NET MVC 1 右键单击该项目并选择特性 在下面web设置开始
  • 如何在 GWT 中实现登录屏幕?

    我正在为后端应用程序编写一个小型 GWT 前端 我想知道 GWT 应用程序的最佳安全模型是什么 我正在考虑实现一种 RPC 方法 该方法从客户端网页接收用户密码的 MD5 然后将会话 ID 传回客户端页面 或失败代码 所有后续调用都将简单地
  • ASP.NET MVC4 中自定义移动显示模式和桌面模式之间的切换

    我想创建切换到完整站点链接并切换到移动链接 我不想通过使用会话变量强制它转到它们中的任何一个 我想知道是否可以使用 ViewSwitcher Controller 自动执行此操作 这是我用于自定义移动显示模式的内容 public class
  • 为什么实体框架尝试选择所有列,即使我只指定了两列?

    我继承了一个 ASP MVC 项目 该项目使用 Entity Framework 6 1 3 与 Dynamics CRM 2011 SQL 数据库进行交互 我正在使用此查询来尝试获取具有帐号的所有活动帐户 并且我仅选择两列为匿名类型 va
  • 在 MVC3 应用程序中使用具有表单身份验证的 Oracle 数据库

    我编写了一个简单的 MVC3 应用程序 并遵循了有关如何设置经过身份验证的用户的教程 本教程使用 SQL Server Express 数据库 是否可以使用 Oracle 数据库代替 SQL Server 这只是更改 web config
  • 如何在 Nhibernate 中进行版本控制?

    我不敢相信让别人向我展示一个简单的工作示例是如此困难 这让我相信每个人都只能说得好像他们知道如何去做 但实际上他们并不知道 我将帖子缩短为仅我想要示例执行的操作 也许帖子太长了 吓跑了人们 为了获得这个赏金 我正在寻找一个可以在 VS 20
  • EF6 找不到 LocalDBConnectionFactory

    我有 2 个项目 类库 作为 DAL 层 和 ASP NET MVC 项目 作为 UI 为了获取数据 我尝试使用 EF6 但它不起作用 所有异常文本 EntityFramework dll 中发生 System InvalidOperati
  • 使用 MongoDB 和 ASP.NET MVC 进行分页的有效方法

    我们正在创建一个应用程序 MongoDB 作为数据库 我们正在使用MongoDB 的官方 C 驱动程序 http docs mongodb org ecosystem drivers csharp 我们有一个包含数千条记录的集合 我们想要创
  • HttpURLConnection 在 Android 2.x 中工作正常,但在 4.1 中不行:未发现身份验证挑战

    我有一些典型的代码 它们使用 HttpURLConnection 来获取带有 URL 的文件 它们在 android 1 x 和 2 x 中运行良好 但在Android 4 1中失败了 我在网上搜索了一下 但几乎没有找到类似的信息 有人愿意
  • 如何将值从控制器传递到asp.net中的视图?

    我正在开发一个应用程序 我需要将用户名的值从控制器传递到视图 我尝试了 ViewData 中给出的http msdn microsoft com en us library system web mvc viewdatadictionary
  • ASPNET MVC - 使用具有相同签名的新助手覆盖 Html.TextBoxFor(model.property)?

    我想用我自己的助手重写 Html TextBoxFor 该助手具有完全相同的签名 当然 但名称空间不同 这是否可能 如果可以 如何实现 原因是我在现有的应用程序中有 100 多个视图 并且我想更改 TextBoxFor 的行为 以便在属性具
  • ASP.NET MVC 应用程序和 ASP.NET Web 应用程序有什么区别

    任何人都可以解释一下 ASP NET 中的 MVC 和 Web 应用程序之间的区别 在mvc中我们可以找到controllers文件夹 我们不能在 Web 应用程序中找到控制器文件夹吗 请消除我的困惑 MVC 使用控制器来编排模型和视图 以
  • 安装 ASP.NET MVC 的修改版本

    我对 MVC 1 0 源代码进行了相对简单的更改 以纠正 DropDownList HtmlHelper 中的错误 在另一个问题中讨论过 https stackoverflow com questions 1614923 persistin
  • Bootstrap 字形未显示在表单中

    我正在尝试不同的方法来制作带有确认的表格 我有以下形式以及一个超链接 下面的超链接正确显示字形 但表单内的提交按钮仅在灰色按钮中显示为 提交 提交按钮和超链接的 CSS 是否需要不同 div class text center using
  • ASP .net MVC中每个数据存储区域的寿命是多少

    我已经看到了一些关于这些的解释 但没有什么可以真正比较它们的开始 结束或重叠的地方 也没有很好的使用例子 以下每个数据集合的生命周期是多少 我还缺什么吗 应用 Session ViewData TempData 应用程序 只要您的应用程序正
  • 使用 R.Net 版本 1.5.5 创建 REngine 实例

    我正在尝试创建一个 Hello World 示例R Language using R Net版本1 5 5 从 NuGet 加载 不幸的是 我见过的在线示例都不起作用 这就是我所做的 已安装Microsoft R Open 3 2 4 增强
  • ASP.NET MVC 中是否有嵌套母版页?

    我想知道 MVC 框架是否可以利用嵌套母版页 如果是这样 有人有一些关于如何实现这一目标的信息吗 我们经常使用嵌套母版页 以便将布局与标准包含和站点范围标记分开 如下所示 站长
  • 从 ASP.NET Web API 返回 HTML

    如何从 ASP NET MVC Web API 控制器返回 HTML 我尝试了下面的代码 但由于未定义 Response Write 而出现编译错误 public class MyController ApiController HttpP
  • Polymer 1.0:用户身份验证 UX(建议、教程和示例)?

    是否有推荐的 聚合物方式 来进行用户身份验证 这个问题包括技术部分和用户体验 用于进行用户身份验证的用户体验的全面示例 和 或教程 将非常棒 注意 Polymer 入门套件不包含任何身份验证 UX 示例 在这个问题中 用户体验 的意思是 完

随机推荐