MVC 6 Cookie身份验证 - 从Cookie获取用户详细信息

时间:2016-02-10 23:10:36

标签: c# asp.net asp.net-mvc authentication

我正在研究使用实体或身份的MVC 6应用程序。相反,我正在使用Dapper。我有一个接受POST请求的控制器,并使用Dapper检查数据库以查看用户名/密码是否匹配。我想要做的就是存储用户名称以及他们是否已登录,以便我可以在后续页面上进行检查。

我环顾四周,似乎使用基于Cookie的身份验证应该允许我做我想做的事情。这是我Startup.cs文件中的相关代码:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    LoginPath = "/account/login",
    AuthenticationScheme = "Cookies",
    AutomaticAuthenticate = true,
    AutomaticChallenge = true
});

以下是我的控制器登录操作中的相关代码:

var user = _repo.FindByLogin(model.VendorId, model.Password);
if (user != null) {
 var claims = new List < Claim > {
  new Claim("VendorId", user.VendorId),
  new Claim("Name", "john")
 };

 var id = new ClaimsIdentity(claims, "local", "name", "role");
 await HttpContext.Authentication.SignInAsync("Cookies", new ClaimsPrincipal(id));
 var l = ClaimsIdentity.DefaultNameClaimType;
 return RedirectToAction("Index", "PurchaseOrders");
}

上面的代码似乎可以保存cookie,但是我不确定如何将用户信息从cookie中取出(甚至如何检索首先是后续请求中的cookie。)

在我的脑海里,我想象的是能够做出像var user = (User)HttpContext.Request.Cookies.Get(????)这样的事情,但我不确定这是不是很实用。

1 个答案:

答案 0 :(得分:0)

您可以使用ClaimsPrincipal.FindFirstValue(xxx)

来获取用户数据

这是我的示例类,可以在Controller / Views中使用它来获取当前用户信息

public class GlobalSettings : IGlobalSettings
    {
        private IHttpContextAccessor _accessor;

        public GlobalSettings(IHttpContextAccessor accessor)
        {
            _accessor = accessor;
        }    

        public string RefNo
        {
            get
            {
                return GetValue(_accessor.HttpContext.User, "employeeid");
            }
        }

        public string SAMAccount
        {
            get
            {
                return GetValue(_accessor.HttpContext.User, ClaimTypes.WindowsAccountName);
            }
        }

        public string UserName
        {
            get
            {
                return GetValue(_accessor.HttpContext.User, ClaimTypes.Name);
            }
        }

        public string Role
        {
            get
            {
                return GetValue(_accessor.HttpContext.User, ClaimTypes.Role);
            }
        }

        private string GetValue(ClaimsPrincipal principal, string key)
        {
            if (principal == null)
                return string.Empty;

            return principal.FindFirstValue(key);
        }
}

DI后控制器中的用法示例:

var currentUser = GlobalSettings.SAMAccount;

请注意,您需要在Startup.cs中的ConfigureServices方法中注入HttpContextAccessor

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();