C# MVC 6 Cookie身份验证-从Cookie获取用户详细信息
我正在开发一个MVC6应用程序,它不使用实体或标识。相反,我用的是简洁。我有一个控制器,它接受POST请求,并使用Dapper检查数据库以查看用户名/密码是否匹配。我想做的就是存储用户名以及他们是否登录,这样我就可以在后续页面上进行检查 我环顾四周,似乎使用基于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=
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>();