如何验证当前用户 ASP.net mvc Identity

2024-04-27

当用户访问我的网站时,他们会看到登录页面。一旦他们成功登录,他们就可以注销并且其他用户可以登录。但是,如果用户在登录时单击后退按钮,则会转到登录页面。此时新用户无法再登录。我收到防伪令牌错误。

我尝试注销任何进入登录页面的用户。我尝试过不同的注销方法。我什至尝试过Session.Abandon();

账户控制者:

// GET: /Account/Login
    [AllowAnonymous]
    public ActionResult Login(string returnUrl)
    {
        EnsureLoggedOut();            
        ViewBag.ReturnUrl = returnUrl;
        // Store the originating URL so we can attach it to a form field
        var viewModel = new LoginViewModel { ReturnUrl = returnUrl };

        return View(viewModel);
    }

    // POST: /Account/Login
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        ApplicationUser user = new ApplicationUser();
        try
        {
            user = DBcontext.Users.Where(u => u.Email.Equals(model.Email)).Single(); // where db is ApplicationDbContext instance

        }
        catch (InvalidOperationException)
        {
            // the user is not exist
            return View("The user does not exist.");
        }

        var result = await SignInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, shouldLockout: false);

        SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                return RedirectToLocal(returnUrl);
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
        }
    }

    // POST: /Account/LogOff
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    { Session.Abandon();
        AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
        return RedirectToAction("Index", "Home");
    }

    private ActionResult RedirectToLocal(string returnUrl)
    {
        if (Url.IsLocalUrl(returnUrl))
        {
            return Redirect(returnUrl);
        }
        return RedirectToAction("Index", "Home");
    }                

}

登录查看:

@model LoginViewModel
@{ViewBag.PageId = "extr-page";
ViewBag.PageClass = "animated fadeInDown";}

@section topright{<span id="extr-page-header-space"> <span class="hidden-mobile">Need an account?</span> <a href="@Url.Action("register", "account")" class="btn btn-danger">Create account</a> </span>
}

<div id="content" class="container">
<div class="row">
    @{ Html.RenderPartial("_LoginText"); }
    <div class="col-xs-12 col-sm-12 col-md-5 col-lg-4">
        <div class="well no-padding">
            <form action="@Url.Action("Login", "Account")" method="POST" id="login-form" class="smart-form client-form">
                <header>
                    Sign In
                </header>
                @Html.HiddenFor(m => m.ReturnUrl)
                @Html.AntiForgeryToken()
                @Html.ValidationBootstrap()
                <fieldset>
                    <section>
                        <label class="label">E-mail</label>
                        <label class="input">
                            <i class="icon-append fa fa-user"></i>
                            <input type="Email" name="Email" value="[email protected] /cdn-cgi/l/email-protection">
                            <b class="tooltip tooltip-top-right"><i class="fa fa-user txt-color-teal"></i> Please enter email address/username</b>
                        </label>
                    </section>

                    <section>
                        <label class="label">Password</label>
                        <label class="input">
                            <i class="icon-append fa fa-lock"></i>
                            <input type="Password" name="Password" value="demo">
                            <b class="tooltip tooltip-top-right"><i class="fa fa-lock txt-color-teal"></i> Enter your password</b>
                        </label>
                        <div class="note">
                            <a href="@Url.Action("forgotpassword", "Account")"><i class="fa fa-frown-o"></i> Forgot password?</a>
                        </div>
                    </section>

                    <section>
                        <label class="checkbox">
                            <input type="checkbox" name="RememberMe" value="true" checked="checked">
                            <input type="hidden" name="RememberMe" value="false" />
                            <i></i>Stay signed in
                        </label>
                    </section>
                </fieldset>
                <footer>
                    <button type="submit" class="btn btn-primary">
                        Sign in
                    </button>
                </footer>
            </form>
        </div>
        @{ Html.RenderPartial("_SocialMedia"); }
    </div>
</div>

我希望当用户点击后退按钮并进入登录页面时,前一个用户会被注销。

更新1:需要明确的是,我并不担心刚刚注销并点击后退按钮的用户。相反,当用户成功登录然后点击后退按钮时,我的网站就会崩溃。它将他们带回登录页面,但由于上述防伪造错误,用户名或密码不起作用。

更新2:我在IE中测试了代码,没有问题。经过进一步研究,当我点击后退按钮时,Chrome 似乎正在保存身份验证 cookie。然而,当我正确注销时,cookie 就会被破坏。我认为当登录页面加载时我正在调用 LogOff 方法,但它并没有删除 cookie。我将继续研究这个问题。也许有人有这方面的经验?

更新3:我确实注意到,当我点击返回按钮时,cookie 没有被删除。当我正确注销时,cookie 就会被删除。当我没有使用下面 Shoe 的方法缓存页面时,点击后退 btn 时 cookie 会被删除。但是,我仍然收到防伪令牌错误。有趣的是,我有一部分标题会在登录页面上弹出。该标头仅应在用户经过身份验证时出现。还应该有一个在身份验证时弹出的旁边菜单。但事实并非如此。我想知道是否有异步问题导致了这两个问题。


发生这种情况的原因可能是页面正在被缓存,并且无法针对登录用户验证为匿名用户生成的防伪令牌。

尝试粘贴OutputCache (ResponseCache在核心)你的属性Login GET这将设置正确的标头以不缓存页面。

[OutputCache(NoStore = true, Duration = 0, Location = OutputCacheLocation.None)]
public ActionResult Login(string returnUrl)
{
    ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何验证当前用户 ASP.net mvc Identity 的相关文章

随机推荐

  • 输入类型=“文件”接受=“图像/*”在手机间隙不起作用?

    我尝试使用 HTML PhoneGap 2 6 0 制作一个 Android 应用程序 它支持
  • parse.com 用户注册无法正常工作的问题

    使用 parse com 和 javaScript SDK 1 6 7 下面的代码用于在我的网站上注册新用户 它有效 真正奇怪的是 如果我注册一个用户 他们就会登录并转发到预期的页面 如果我随后将它们注销并立即注册另一个用户 则它们是在后端
  • 如何旋转矢量?

    如果我有 1 0 我旋转它90 degrees 1 2PI radians 我应该得到 0 1 我该如何实现这一目标 我在看这一页 http en wikipedia org wiki Rotation matrix并实现了这个 var r
  • 如何使用此 Linq2Sql 减少数据库往返次数?

    我有以下 Linq2Sql 它为我的 SELECT 语句执行不止一次往返 我不知道为什么 首先是代码 然后是解释 from p in db Questions select new Models Question Title p Title
  • 为什么 Google 使用内联 JavaScript 和 CSS? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何通过 CSharp 以编程方式设置输入元素的值?

    你好 我正在尝试让 IE 自动登录网站 但问题是输入元素没有 HTML ID 属性 例如
  • Grid.Mvc.Ajax扩展网格初始化

    您好 我对使用 JQuery 和 Ajax 的 Web GUI 开发非常陌生 我正在尝试让 nuget 包 Grid MVC Ajax 正常工作 自述文件指出以下内容 Follow thse steps to use Grid Mvc Aj
  • Eclipse CDT 内置包含目录

    Under Eclipse CDT gt Project Settings gt C C General gt Paths and Symbols gt Includes gt GNU C 有一个包含路径的列表 有些是粗体的并且是特定于项目
  • 迁移到 Qt6/PyQt6:Qt5 中所有已弃用的短格式名称是什么?

    我正在尝试从以下位置迁移代码库PyQt5 to PyQt6 我读过这篇文章 参见https www pythonguis com faq pyqt5 vs pyqt6 https www pythonguis com faq pyqt5 v
  • 一个电子邮件地址中可以有多少个@符号?

    是否有任何规则要求在任何电子邮件 ID 中包含指定数量的 符号 如果我们要使用 PHP 检查电子邮件 ID 是否有效 我就会想到 如果引用多个 被允许 我必须问你为什么需要这些信息 拜托拜托please不要尝试编写正则表达式 函数或其他任何
  • 最好的分布式暴力对抗措施是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 首先 有一点背景知识 众所周知 我正在为 CodeIgniter 实现一个 auth auth 系统 并且到目前为止我正在获胜 可以这么说 但我
  • 请解释为什么以及如何 +new Date();在 IE8 或更低版本中作为 Date.now() 的“解决方法”

    我正在看书 面向 Web 开发人员的专业 JavaScript 给出有关此问题的背景信息 特别是有关引用类型的第 5 章 我想知道为什么以及如何var start new Date 用于获取 now 的当前毫秒表示 作为不支持 ECMASc
  • 从 Google AppEngine 切换到另一台服务器

    目前 我正在 Google AppEngine GAE 上构建我的 Java Web 应用程序 但由于它们有很多限制 我担心我必须从 GAE 切换到运行 Glassfish 或如果需要 我可以设置任何其他服务器 我还计划运行 Oracle
  • 为什么我不能返回通用“T”来满足 Partial

    我用 TypeScript 写了一些代码 type Point x number y number function getThing
  • 所有原始包装类都是不可变对象吗?

    Java 中的所有原始包装类都是不可变对象吗 字符串是不可变的 其他不可变对象是什么 Any type which doesn t give you any means to change the data within it is imm
  • 使用 Bash 比较 PHP 版本号?

    我有这个脚本 应该确保用户当前的 PHP 版本在某个范围内 尽管它应该可以工作 但某个地方有一个错误 使它认为版本超出范围 有人可以看一下并告诉我我能做什么来解决它 function version echo gawk F printf d
  • SVG 元素绕圆旋转

    所以我有一个 SVG 元素 大圆圈 和里面的一组元素 我想围绕这个大圆圈旋转这些元素 代码非常简单 但我已经开始担心如何在正确的路径 大圆圈 上设置这个圆圈 graph skils 正如您在下面的链接中看到的 这个小圆圈在大圆圈上旋转不正确
  • 调试严重的 SIGILL 崩溃:文本段损坏

    我们的系统是基于 PowerPC 的运行 Linux 的嵌入式系统 我们遇到了随机的 SIGILL 崩溃 这种情况在各种应用程序中都会出现 崩溃的根本原因是将要执行的指令归零 这表明内存中的文本段已损坏 由于文本段是以只读方式加载的 因此应
  • openpyxl 图表误差线样式

    我被分配了一项 简单 的任务 即将一系列数据列收集到结果工作簿中 结果工作簿包含分析结果所需的公式和图表 这些数据是由我用 python 编写的图像分析应用程序生成的 作为一系列 Excel 工作簿 现在的问题是 openpyxl 会删除
  • 如何验证当前用户 ASP.net mvc Identity

    当用户访问我的网站时 他们会看到登录页面 一旦他们成功登录 他们就可以注销并且其他用户可以登录 但是 如果用户在登录时单击后退按钮 则会转到登录页面 此时新用户无法再登录 我收到防伪令牌错误 我尝试注销任何进入登录页面的用户 我尝试过不同的