すべてのコントローラーメソッドで JWT から userId を取得しますか? 質問する

すべてのコントローラーメソッドで JWT から userId を取得しますか? 質問する

認証と承認に JWT を使用する Core 2.0 Web API プロジェクトを作成しています。保護したいコントローラー メソッドはすべて、属性で装飾されていますAuthorize

これは機能しています。Bearer ヘッダーで JWT を渡すと、200 が返されます。JWT を渡せない場合は、401 が返されます。すべて機能しています。私の JWT では、認証時にユーザー ID を 'UserId' フィールドに保存しました。

var claimsdata = new[] {
                    new Claim("UserId", user.Id.ToString()),

次に拡張メソッドを使用します:

public static string GetUserId(this IPrincipal user)
        {
            if (user == null)
                return string.Empty;

            var identity = (ClaimsIdentity)user.Identity;
            IEnumerable<Claim> claims = identity.Claims;
            return claims.FirstOrDefault(s => s.Type == "UserId")?.Value;
        }

コントローラー メソッドの「Authorize」では、ユーザーの ID が必要になることがよくあります。そこで、GetUserId メソッドを呼び出します。これでうまくいきます。ただし、これがトークンから ID を取得する最良の方法であるかどうかはわかりません。

int.TryParse(User.GetUserId(), out _userId);

すべてのコントローラーでそのコードを使用する必要があります。コンストラクターでは実行できません。それは間違っていると思います。

ここで私がやっていることは正しいでしょうか?

ベストアンサー1

ControllerBaseUser次のようなプロパティが含まれていますClaimsPrincipal

ユーザーのクレームUser.Claimsには、IPrincipal

GetUserIdメソッドを含むベースコントローラを作成します。protected

public abstract class BaseController : Controller
{        
    protected int GetUserId()
    {
        return int.Parse(this.User.Claims.First(i => i.Type == "UserId").Value);
    }
}

そしてすべてのコントローラーはこれを継承し、すべてのコントローラーがアクセスできるようになりますUserId

おすすめ記事