[解決済み] ClaimsIdentity IsAuthenticatedが常にfalseになるのはなぜですか(web api Authorize filterの場合)?
2023-08-05 07:42:16
質問
Web API プロジェクトで、通常の認証プロセスをオーバーライドして、代わりにトークンをチェックするようにしています。コードは次のようなものです。
if ( true ) // validate the token or whatever here
{
var claims = new List<Claim>();
claims.Add( new Claim( ClaimTypes.Name, "MyUser" ) );
claims.Add( new Claim( ClaimTypes.NameIdentifier, "MyUserID" ) );
claims.Add( new Claim( ClaimTypes.Role, "MyRole" ) );
var claimsIdentity = new ClaimsIdentity( claims );
var principal = new ClaimsPrincipal( new[] { claimsIdentity } );
Thread.CurrentPrincipal = principal;
HttpContext.Current.User = principal;
}
そして、後で
[Authorize]
属性をコントローラに適用すると、認証に失敗します。
デバッグコードで同じ動作を確認しています。
// ALWAYS FALSE!
if ( HttpContext.Current.User.Identity.IsAuthenticated ) {
// do something
}
有効なClaimsIdentityを構築し、スレッドに割り当てたにもかかわらず、ユーザが認証されていないと判断されるのはなぜですか?
どのように解決すればよいですか?
この問題は、.Net 4.5 のブレークポイントに起因しています。説明されているように この記事 で説明されているように、単にクレーム ID を作成しても IsAuthenticated が真を返さなくなりました。代わりに、コンストラクタに何らかの文字列 (何でもかまいません) を渡す必要があります。
そこで、上記のコードのこの行を
var claimsIdentity = new ClaimsIdentity( claims );
これになる。
// exact string doesn't matter
var claimsIdentity = new ClaimsIdentity( claims, "CustomApiKeyAuth" );
そして、問題は解決されます。 更新しました。 Leoの他の回答を参照してください。正確なAuthenticationTypeの値は、あなたの認証パイプラインにある他のものによって重要であったりなかったりするかもしれません。
更新2: Robin van der Knaapがコメントで提案したように、1つの
System.Security.Claims.AuthenticationTypes
の値のいずれかが適切である可能性があります。
var claimsIdentity = new ClaimsIdentity( claims, AuthenticationTypes.Password );
// and elsewhere in your application...
if (User.Identity.AuthenticationType == AuthenticationTypes.Password) {
// ...
}
関連
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み】ASP.NET Web APIのJWT認証について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない