ASP.NET身份用户登录后为空

2024-06-28

Edit 1

更新代码以更好地处理这个问题后,我现在遇到了以下问题:

提供的防伪令牌适用于与当前用户不同的基于声明的用户。

这是更新后的代码:

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
if (result == SignInStatus.Success)
{
    var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
    var manager = new UserManager<ApplicationUser>(store);
    var user = manager.FindById(User.Identity.GetUserId());
    GenerateUserCookie(model, user, returnUrl);
}
switch (result)
{
    case SignInStatus.LockedOut:
        return View("Lockout");
    case SignInStatus.RequiresVerification:
        return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
    case SignInStatus.Failure:
        ModelState.AddModelError("", "Invalid login attempt.");
        return View(model);
    default:
        return View(model);
}

private ActionResult GenerateUserCookie(LoginViewModel model, ApplicationUser user, string returnUrl)
{
    if (user == null)
    {
        ModelState.AddModelError("", "Someething went wrong; please try logging in again.");
        return View(model);
    }

    var cookie = new HttpCookie("stman");
    if (user.AgentId >= 1) cookie.Values.Add("aid", user.AgentId.ToString());

    cookie.Values.Add("wumpus", user.Id.ToString());
    Response.Cookies.Add(cookie);
    return RedirectToLocal(returnUrl);
}

原始问题

正如标题所说,我登录后,以下代码返回的user值仍然为null。

要真正获得用户,我必须再次打开登录屏幕(而不是刷新)并再次登录......

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

    // This doesn't count login failures towards account lockout
    // To enable password failures to trigger account lockout, change to shouldLockout: true
    var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
    switch (result)
    {
        case SignInStatus.Success:
            var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
            var manager = new UserManager<ApplicationUser>(store);
            var user = manager.FindById(User.Identity.GetUserId());
            GenerateUserCookie(user);
            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);
    }
}

private void GenerateUserCookie(ApplicationUser user)
{
    var cookie = new HttpCookie("stman");

    // Throws exception most times since the user is null.
    if (user.AgentId >= 1)
    {
        cookie.Values.Add("aid", user.AgentId.ToString());
    }
    cookie.Values.Add("wumpus", user.Id.ToString());
    Response.Cookies.Add(cookie);
}

问题是User.Identity在您重定向之前不可用。解决这个问题的一个简单方法是使用用户名而不是 id 来获取正确的ApplicationUser.

var manager = new UserManager<ApplicationUser>(store);
var user = manager.FindByName(model.UserName);
GenerateUserCookie(user);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET身份用户登录后为空 的相关文章

随机推荐

  • Hashie::Mash 从字符串恢复

    我在这个问题上很挣扎 我已经存储了一个Hashie Mash到一个字符串中 我很难将其恢复为哈希值 这是字符串 map Hashie Mash ncreated at Mon Jul 30 15 42 20 0000 2012 nid 22
  • IOS 7 中的外部蓝牙键盘集成

    我需要在应用程序中支持外部键盘功能 并且需要在应用程序中检测到 Alt Tab Tab 等组合键以触发某些事件 在 IOS 6 中我已经重写了 void sendEvent UIEvent anEvent 函数在UIApplication
  • Spring属性文件设置默认值

    我的 war 文件之外有一个属性文件 系统管理员使用该文件来关闭某些系统功能 它在我的本地计算机上运行得很好 但是当我们部署到开发环境时 属性文件未上传 应用程序无法启动 我想知道是否有一种方法可以在我的 applicationContex
  • Twitter Bootstrap 按钮在 IE8 中无响应

    IE 对我来说是个谜 我的网络应用程序可以在 Safari Firefox Chrome 甚至 iPhone 和 iPad 上运行 但当涉及到 IE 时 我根本无法理解遵守给定标准有多么困难 无论如何 足够的咆哮 我的 Twitter 引导
  • 有没有例子展示如何编写 DirectShow 转换过滤器?

    我想捕获当前帧及其前一帧进行分析并生成一个新帧来显示 是说我必须写一个变换DirectShow过滤器吗 但我是 DirectShow 的新手 我被MSDN的大量文档弄糊涂了 所以我想知道是否有任何简单的例子来展示如何做到这一点 谢谢 厨师
  • 在 Bitbucket API 中,如何获取所有许可用户的列表?

    我看过Bitbucket API 文档 https developer atlassian com bitbucket api 2 reference resource 和这篇文章BitBucket 获取所有贡献者列表 https stac
  • 如何创建 Azure.AsyncPageable 进行模拟?

    我想模拟一个返回一个 C 方法Azure AsyncPageable 这个类只有受保护的构造函数 所以我不能直接实例化它 有没有办法从其他集合 例如IAsyncEnumerable或者只是一个List 您可以创建Page物体using Pa
  • 如何将一串空格分隔的数字拆分为整数?

    我有一根绳子 42 0 例如 并且需要获取两个整数的数组 我可以做一个 split在一个空间上 The obvious approach to this problem is a common combination of simple t
  • Jackson:在反序列化时获得空引用

    我正在使用 spring mvcrestful服务 通过添加依赖项 我的其余控制器会自动generate json从我的response entities 依赖性 jackson 2 9 0 compile com fasterxml ja
  • 在 Javascript 变量声明中使用逗号[重复]

    这个问题在这里已经有答案了 我刚刚遇到以下代码 function showMatch str reg var res matches while true matches reg exec str if matches null break
  • 激活 IInterceptor 时出错...仅通过 COM?

    TL DR Kernel Get
  • S3 - 访问控制允许来源标头

    有没有人设法添加Access Control Allow Origin到响应头 我需要的是这样的 img src http 360assets s3 amazonaws com tours 8b16734d 336c 48c7 95c4 3
  • DateTime.Now 相当于 TimeOnly 和 DateOnly?

    NET 6 C 10 推出TimeOnly and DateOnly结构体 分别表示仅时间和日期 老好人DateTime结构总是有一个Now静态属性将为您提供当前日期和时间 我期待着两者TimeOnly and DateOnly结构具有类似
  • 在线程中访问 UI

    当我尝试更改 UI 属性 特别是启用 时 我的线程抛出 System Threading ThreadAbortException 如何在线程中访问 UI 您可以使用BackgroundWorker 然后像这样更改UI control In
  • 如何使用 R 获取所有 S&P500 公司代码列表?

    我想在R中制作FOR语句来一次性分析股票数据 但我不知道如何获得 S P 公司代码列表 请让我知道解决方案 谢谢 library rpart library rpart plot library quantmod startDate as
  • Kubernetes中使用fluidd读取容器日志时的权限问题

    我对 kubernetes 非常陌生 并且在 GCE 中运行了带有 redis 和 mongodb 的测试应用程序 我想用 Fluentd 抓取我的日志文件并将它们发送到 logz 我使用以下 Fluentd 配置文件 我在本地计算机上测试
  • Java catch块,捕获的异常不是final的

    我正在检查 Java SE7 的新功能 目前处于以下状态 http docs oracle com javase 7 docs technotes guides language catch multiple html http docs
  • 在 flutter 中使用按钮手势旋转文本或图像

    现在 当我做出 360 度手势时 图像仅从左向右平滑旋转 所需结果 当我们做出 360 度手势时应该从右向左旋转 Done 当我们做出 360 度手势时 应该从右向左旋转 一旦我们在某个点开始从左向右旋转 然后再次从右向左旋转 它应该从做出
  • Rails - 查找多个数组之间的交集

    我正在尝试查找多个数组之间的交集值 例如 code1 1 2 3 code2 2 3 4 code3 0 2 6 所以结果是 2 我知道在 PHP 中你可以使用 array intersect 来做到这一点 我希望能够轻松添加额外的数组 所
  • ASP.NET身份用户登录后为空

    Edit 1 更新代码以更好地处理这个问题后 我现在遇到了以下问题 提供的防伪令牌适用于与当前用户不同的基于声明的用户 这是更新后的代码 var result await SignInManager PasswordSignInAsync