首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >User.Identity.GetUserId()在成功登录后返回null

User.Identity.GetUserId()在成功登录后返回null
EN

Stack Overflow用户
提问于 2015-11-27 15:02:37
回答 8查看 29.3K关注 0票数 45

我定义了一个临时变量来获取当前用户id,它总是返回null。

以下是快照:

为什么?

更新:

代码语言:javascript
复制
    //
    // POST: /Account/Login
    [HttpPost]
    [AllowAnonymous]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return Json(new { success = false, ex = "Fail to login." });
        }

        var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, isPersistent: true, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                string userId = User.Identity.GetUserId();
                return Json(new { success = true });
            case SignInStatus.Failure:
                return Json(new { success = false, ex = "Email or password was incorrect." });
            default:
                return Json(new { success = false, ex = "Fail to login." });
        }
    }

更新2:

在客户端,我使用ajax连接到/Account/Login

代码语言:javascript
复制
var loginAjax = function (email, password, callback) {        
        $.ajax({
            url: '/Account/Login',
            type: 'POST',
            data: { Email: email, Password: password },
            success: function (data) {
                $('body').css('cursor', 'default');
                if (data.success) {                    
                    callback(true)
                } else {
                    $('#login-error').text(data.ex)
                }
            },
            error: function () {                
                $('#login-error').text('Không thể kết nối đến máy chủ.')
            }
        });
        callback(false)
    };


// I've got email and password in another function to check valid or not
loginAjax(email, password, function (success) {
            $('body').css('cursor', 'default');
            switch (success) {
                case true:
                    signin(function () {
                        $('.login').html('');
                        window.location.href = '/?type=Promotion';
                    });
                    break
                case false:                    
                    $('#Email-active').hide();
                    $('#Password-active').hide();
                    $('#Password').val('');
                    $('#login-btn').removeClass('disabled').attr('onclick', '$(this).addClass("disabled").removeAttr("onclick"); running()');
                    break
            }
        });

客户端的SignalR:

代码语言:javascript
复制
var signalR = $.connection.chat;
var signin = function (callback) {
            $.connection.hub.start().done(function () {
                signalR.server.signinToSignalR();
                callback()
            })
        };

服务器端的SignalR:

代码语言:javascript
复制
public void SigninToSignalR()
    {
        // this's always null
        string userId = HttpContext.Current.User.Identity.GetUserId();
    }
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2015-11-27 15:13:03

实际上,用户不是登录的用户-不是在当前请求( POST /Account/Login请求)的上下文中,这是User.Identity获取数据的地方。如果您想要提取当前尝试(显然成功了)登录的用户的id,则需要通过其他方式来实现,比如劫持SignInManager.PasswordSignInAsync调用中的某个步骤。如果您正在实现自己的MembershipProvider,这应该很容易。

否则,您将不得不等待下一个请求(由某个控制器的方法处理的任何请求)以您想要的方式使用User.Identity

一些补充的解释

当您的Login方法被调用时,请求上下文已经被评估,并且有大量数据可用。例如HTTP报头、cookies等。这是找到所有上下文信息的地方,比如User.Identity

当您调用SignInManager.PasswordSignInAsync(...)时,这不会影响请求上下文的值,因为这是没有意义的-因为浏览器并没有改变它几毫秒前发送的内容。它所影响的是响应上下文添加一个包含一些用户和会话id的cookie。然后,此cookie被发送到浏览器,然后浏览器针对每个后续请求将其发送回服务器。因此,所有晚于此请求的请求(直到用户注销或cookie变得太旧)都将包含供User.Identity解释的信息。

票数 33
EN

Stack Overflow用户

发布于 2017-01-19 00:48:55

简单地尝试一下:

代码语言:javascript
复制
string userId = SignInManager
.AuthenticationManager
.AuthenticationResponseGrant.Identity.GetUserId();
票数 33
EN

Stack Overflow用户

发布于 2016-10-07 15:38:03

在本例中,您可以使用其他数据来查找刚刚登录的用户。因为我们知道登录是成功的,并且用户名是唯一的,所以下面的代码将会起作用;

代码语言:javascript
复制
 //
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid)
    {
        return Json(new { success = false, ex = "Fail to login." });
    }

    var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, isPersistent: true, shouldLockout: false);
    switch (result)
    {
        case SignInStatus.Success:
            string userId = UserManager.FindByName(model.Email)?.Id;
            return Json(new { success = true });
        case SignInStatus.Failure:
            return Json(new { success = false, ex = "Email or password was incorrect." });
        default:
            return Json(new { success = false, ex = "Fail to login." });
    }
}
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33951881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档