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)
});
私はいくつかの研究を行ったが、解決策が見つかりませんでした。 ドキュメントへのリンク 私が使用しました:
誰でもこの問題を解決する方法を教えてください。
authenticationBuilder.AddCookie("MyCookieMiddlewareInstance", …)
これは、認証スキーム名"MyCookieMiddlewareInstance"
を使用してCookie認証ハンドラーを登録します。したがって、Cookie認証スキームを参照するときは常に、その正確な名前を使用する必要があります。そうしないと、スキームが見つかりません。
ただし、AddAuthentication
呼び出しでは、異なるスキーム名を使用しています。
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
これにより、CookieAuthenticationDefaults.AuthenticationScheme
が登録されます。これは、定数値"Cookies"
をデフォルトの認証スキームとして持っています。しかし、その名前のスキームは登録されません!代わりに、"MyCookieMiddlewareInstance"
のみがあります。
そのため、解決策は両方の呼び出しに同じ名前を使用することです。デフォルトを使用して、明示的な名前を削除することもできます。複数のスキームがなく、より詳細な制御が必要な場合、実際に名前を明示的に設定する必要はありません。
これを見つけて不満を抱く人のために、私のアドバイスは、この質問に対する答えを見てみましょう。 ASP.NET Core 2.0認証ミドルウェア
そこにあるものを繰り返しすぎることなく、この問題はASP.Net Core 1と2の間のセキュリティの変更に関連しているようです。確かに、そこでのアドバイスは私自身の問題を解決しました。このブログ投稿もご覧ください: https://ignas.me/tech/custom-authentication-asp-net-core-20/ (これはSO回答)
HttpContext.Authentication
はASP.netコア2.0では廃止されているため、代わりにHttpContext.Authentication.SignInAsync
を使用しますHttpContext.SignInAsync