我使用以下代码在ASP.NET Core 2.0中使用cookie进行身份验证
services
.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie("MyCookieMiddlewareInstance", options =>
{
options.AccessDeniedPath = new PathString("/Account/Login");
options.LoginPath = new PathString("/Account/Login");
options.LogoutPath = new PathString("/Account/LogOff");
});
我收到错误:
未指定authenticationScheme,且未找到DefaultChallengeScheme
Cookie设置如下:
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, userId.ToString()),
new Claim(ClaimTypes.Name, userName)
};
var identity = new ClaimsIdentity(claims, "Forms");
identity.AddClaim(new Claim(ClaimTypes.Role, "ADMIN"));
var principal = new ClaimsPrincipal(identity);
HttpContext.Authentication.SignInAsync("MyCookieMiddlewareInstance", principal, new AuthenticationProperties
{
IsPersistent = isPersistent,
ExpiresUtc = DateTime.UtcNow.AddYears(1)
});
我做了一些研究并没有找到解决方案。以下是我使用的a link to the doc:
任何人都可以告诉我如何解决这个问题?
答案 0 :(得分:10)
authenticationBuilder.AddCookie("MyCookieMiddlewareInstance", …)
使用身份验证方案名称"MyCookieMiddlewareInstance"
注册cookie身份验证处理程序。因此,无论何时提到cookie身份验证方案,您都需要使用该确切名称,否则您将无法找到该方案。
但是,在AddAuthentication
调用中,您使用的是不同的方案名称:
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
这会将具有常量值CookieAuthenticationDefaults.AuthenticationScheme
的{{1}}注册为默认身份验证方案。但具有该名称的计划从未注册过!相反,只有"Cookies"
。
因此,解决方案是简单地为两个调用使用相同的名称。您也可以只使用默认值,并删除显式名称;如果您没有多个方案并且需要更多控制,则无需明确设置其名称。
答案 1 :(得分:4)
对于那些落在这上面而感到沮丧的人,我的建议是看看这个问题的答案:ASP.NET Core 2.0 authentication middleware
如果没有重新发现你发现的东西太多,似乎这个问题与ASP.Net Core 1和2之间的安全性变化有关。当然,那里的建议解决了我自己的问题。这篇博客文章也值得一看:https://ignas.me/tech/custom-authentication-asp-net-core-20/(我怀疑这是根据SO答案撰写的)
答案 2 :(得分:0)
HttpContext.Authentication
在ASP.net核心2.0中已经过时了,所以相反
HttpContext.Authentication.SignInAsync
使用HttpContext.SignInAsync