没有指定authenticationScheme,并且没有找到DefaultChallengeScheme的Cookies身份验证

时间:2017-09-18 07:25:19

标签: c# authentication asp.net-core

我使用以下代码在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

任何人都可以告诉我如何解决这个问题?

3 个答案:

答案 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