如何在 ASP.NET 中获取登录用户信息

Posted

技术标签:

【中文标题】如何在 ASP.NET 中获取登录用户信息【英文标题】:How to get logged in user information in ASP.NET 【发布时间】:2019-09-12 20:33:43 【问题描述】:

我正在处理 ASP.NET 项目,我试图捕获当前登录的用户信息,例如它的电子邮件地址。 如果使用 cookie 信息,很容易获得该电子邮件地址,但我不想要它。因为那是低安全性。 这是我尝试过的一些代码。

                var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;
                string email = identity.Claims.Where(c => c.Type == ClaimTypes.Email)
                               .Select(c => c.Value).SingleOrDefault();
                return Ok(email);

但是我得到了 NULL 的响应。我认为这是因为 Token 信息和 (ClaimPrincipal)Thread.CurrentPrincipal 方法。 如何使用上述代码获取当前用户的信息。

【问题讨论】:

您必须在声明中添加电子邮件,否则令牌无效 【参考方案1】:

您必须在用户验证后添加customized claims,以便之后使用。

identity.AddClaim(new Claim(ClaimTypes.Email, user.Email));

这是将电子邮件添加到索赔的示例。

public ActionResult Login(LoginViewModel model, string returnUrl)

    if (ModelState.IsValid)
    
        var user = _AccountService.VerifyPassword(model.UserName, model.Password, false);
        if (user != null)
        
            var identity = new ClaimsIdentity(new[]  new Claim(ClaimTypes.Name, model.UserName), , DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);

            identity.AddClaim(new Claim(ClaimTypes.Role, user.Role));
            identity.AddClaim(new Claim(ClaimTypes.GivenName, user.Name));
            identity.AddClaim(new Claim(ClaimTypes.Email, user.Email));

            AuthenticationManager.SignIn(new AuthenticationProperties
            
                IsPersistent = model.RememberMe
            , identity);

            return RedirectToAction("Index", "Home");
        
        else
        
            ModelState.AddModelError("", "Invalid username or password.");
        
    

    return View(model);

【讨论】:

【参考方案2】:

如果没有Token授权,则响应为NULL。 通过在请求标头中使用“授权”,我得到了登录用户的电子邮件地址和名称。

这里有一些发送请求的代码。

    var AuthData = JSON.parse(UserCustomService.getSessionStorage("Token")); //get Token
    var headers = 
        "Content-Type": "application/x-www-form-urlencoded",
        "Accept": "application/x-www-form-urlencoded",
        "cache-control": "no-cache",
        "Authorization": "Bearer " + AuthData.access_token, // Bearer:type of Token
    ;

    var GetUserInformation = function () 

        var config = 
            "async": true,
            "crossDomain": true,
            "url": ApiBaseUrl + "/GetUserInformation", // user defined route
            "method": "GET",
            "headers": headers
        ;

        $.ajax(config).done(function (response) 
            if (response) 
                return ShowUserInformation(response);
             else return null;
        );
    
    var ShowUserInformation = function (response) 
        $scope.User_EmailAddress = response.EmailAddress;
        $scope.User_FirstName = response.FirstName;
        $scope.User_LastName = response.LastName;
    

出于安全考虑,我认为令牌应该包含在所有请求标头中,用于获取和更新数据库中的当前用户信息。

【讨论】:

以上是关于如何在 ASP.NET 中获取登录用户信息的主要内容,如果未能解决你的问题,请参考以下文章

asp.net mvc 如何实现自动提交或保留用户未登录前得信息

ASP.NET MVC2 Membership:如何获取登录用户的 userID 和 roleID?

CAS ,ASP.NET怎么获取更多的用户信息?

如何在asp.net网站中获取cookie值

asp.net Web 应用程序返回 IIS 信息而不是当前用户凭据

如何使用 asp.net mvc 5 中的单选按钮检索登录详细信息?