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

C# MVC 6 Cookie身份验证-从Cookie获取用户详细信息,c#,asp.net,asp.net-mvc,authentication,C#,Asp.net,Asp.net Mvc,Authentication,我正在开发一个MVC6应用程序,它不使用实体或标识。相反,我用的是简洁。我有一个控制器,它接受POST请求,并使用Dapper检查数据库以查看用户名/密码是否匹配。我想做的就是存储用户名以及他们是否登录,这样我就可以在后续页面上进行检查 我环顾四周,似乎使用基于Cookie的身份验证应该允许我做我想做的事情。以下是我的Startup.cs文件中的相关代码: app.UseCookieAuthentication(新的CookieAuthenticationOptions { LoginPath=

我正在开发一个MVC6应用程序,它不使用实体或标识。相反,我用的是简洁。我有一个控制器,它接受POST请求,并使用Dapper检查数据库以查看用户名/密码是否匹配。我想做的就是存储用户名以及他们是否登录,这样我就可以在后续页面上进行检查

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

app.UseCookieAuthentication(新的CookieAuthenticationOptions
{
LoginPath=“/account/login”,
AuthenticationScheme=“Cookies”,
自动验证=真,
自动挑战=真
});
以下是我的控制器登录操作中的相关代码:

var user=\u repo.FindByLogin(model.VendorId,model.Password);
如果(用户!=null){
var索赔=新列表<索赔>{
新索赔(“VendorId”,user.VendorId),
新索赔(“姓名”、“约翰”)
};
var id=新的索赔实体(索赔,“本地”、“名称”、“角色”);
等待HttpContext.Authentication.SignInAsync(“Cookies”,新的ClaimsPrincipal(id));
var l=ClaimsIdentity.DefaultNameClaimType;
返回重定向操作(“索引”、“采购订单”);
}
上面的代码似乎在保存cookie时起作用,但我不确定如何从cookie中获取用户信息(甚至不知道如何在后续请求中检索cookie)


在我看来,我正在想象能够做一些类似的事情:
var user=(user)HttpContext.Request.Cookies.Get(??)
,但我不确定这是否实用。

您可以使用ClaimsPrincipal.FindFirstValue(xxx)返回用户数据

下面是我的示例类,可以在控制器/视图中使用它来获取当前用户信息

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>();
services.AddSingleton();

请求中存在cookie:。使用cookie数据预填充字段或其他内容是可以的,但是最终用户可以操纵cookie,所以千万不要盲目信任其中的信息。明白了。那么,将数据保存在服务器端会话中会更好吗?如果是这样,同样的问题也适用。似乎微软在尝试使用Identity+EF之外的任何东西时都会感到非常痛苦。是的,我建议将数据存储在服务器上的会话中。
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();