認証と承認に 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
ControllerBase
User
次のようなプロパティが含まれています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