我正在研究不使用实体或身份的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(????)
这样的事情,但我不确定这是不是很实用。
答案 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>();