web-dev-qa-db-ja.com

authenticationSchemeが指定されておらず、Cookie認証が見つかったDefaultChallengeSchemeがありませんでした

Cookieを使用したASP.NET Core 2.0での認証に以下のコードを使用しています

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)
});

私はいくつかの研究を行ったが、解決策が見つかりませんでした。 ドキュメントへのリンク 私が使用しました:

誰でもこの問題を解決する方法を教えてください。

28
San Jaisy
authenticationBuilder.AddCookie("MyCookieMiddlewareInstance", …)

これは、認証スキーム名"MyCookieMiddlewareInstance"を使用してCookie認証ハンドラーを登録します。したがって、Cookie認証スキームを参照するときは常に、その正確な名前を使用する必要があります。そうしないと、スキームが見つかりません。

ただし、AddAuthentication呼び出しでは、異なるスキーム名を使用しています。

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)

これにより、CookieAuthenticationDefaults.AuthenticationSchemeが登録されます。これは、定数値"Cookies"をデフォルトの認証スキームとして持っています。しかし、その名前のスキームは登録されません!代わりに、"MyCookieMiddlewareInstance"のみがあります。

そのため、解決策は両方の呼び出しに同じ名前を使用することです。デフォルトを使用して、明示的な名前を削除することもできます。複数のスキームがなく、より詳細な制御が必要な場合、実際に名前を明示的に設定する必要はありません。

11
poke

これを見つけて不満を抱く人のために、私のアドバイスは、この質問に対する答えを見てみましょう。 ASP.NET Core 2.0認証ミドルウェア

そこにあるものを繰り返しすぎることなく、この問題はASP.Net Core 1と2の間のセキュリティの変更に関連しているようです。確かに、そこでのアドバイスは私自身の問題を解決しました。このブログ投稿もご覧ください: https://ignas.me/tech/custom-authentication-asp-net-core-20/ (これはSO回答)

4
John Reilly

HttpContext.AuthenticationはASP.netコア2.0では廃止されているため、代わりにHttpContext.Authentication.SignInAsyncを使用しますHttpContext.SignInAsync

0
YuriyP