Kami menggunakan pengguna yang ada di aws cognito , aplikasi klien terpisah dibuat untuk server API kami.

Saat menggunakan UI yang dihosting dari cognito accesstoken , idtoken dan Refreshtoken .

Masalahnya adalah ketika menambahkan jwtauthprovidreader ke feature untuk melakukan validasi token kita mendapatkan " http / 1.1 401 tidak sah " untuk setiap titik akhir yang kita buat dengan Atribut [otentikasi].

Plugins.Add(new AuthFeature(() => new AuthUserSession(),
  new IAuthProvider[]
  {
    new JwtAuthProviderReader
    {
      Audience = "11rqr096c55xxxxxxxxxxxxxx", // App client id
      Issuer = "https://cognito-idp.eu-west-1.amazonaws.com/eu-west-1_xxXxxXXxX",
      HashAlgorithm = "RS256",
      PublicKey = new RSAParameters
      {
        Modulus = Base64UrlEncoder.DecodeBytes("JRDU3q2XoOcKGjcj1DsJ3Xj .... DTNVCGzUCGosKGYL0Q"),
        Exponent = Base64UrlEncoder.DecodeBytes("AQAB")
      },
      RequireSecureConnection = false,          
    }
  }
)
{ 
  IncludeAssignRoleServices = false
});

Modulus dan eksponen dari e dan n dalam respons yang terkenal ref https://cognito-idp.eu-west-1.amazonaws.com/eu-west-1_xxxxxxxx/.well -Kemampuan / jwks.json

Layanan yang dilindungi oleh atribut otentikasi selalu mengembalikan http / 1.1 401 tidak sah

[Authenticate]
public object Get(GetTenants request)
{
   return ...;
} 

Bagaimana kita bisa tahu bahwa jwtauthprovidreader diatur dengan benar?

1
Kai-Rune 5 April 2021, 01:09

1 menjawab

Jawaban Terbaik

Anda dapat menguji apakah jwt Anda dapat divalidasi dengan servicestack's jwt auth provider dengan menguji token JWT di IsJwtValid API dari instance JwtAuthProviderReader yang dikonfigurasi, misalnya:

var jwtAuth = new JwtAuthProviderReader { ... };
jwtAuth.IsJwtValid(jwt);

Ini akan mengembalikan false jika jwt tidak valid. Ada banyak alasan mengapa JWT tidak akan valid, jadi hal pertama yang saya periksa adalah untuk menguji Anda benar-benar dapat mendekripsi token jwe dengan menelepon GetVerifiedJwePayload(), mis.

var jsonObj = jwtAuth.GetVerifiedJwePayload(null, jwt.Split('.'));

Jika berhasil itu akan mengembalikan objek JSON yang didekripsi tetapi tidak diverifikasi. Ini akan gagal dengan konfigurasi Anda saat ini karena mendekripsi token RSA JWE memerlukan konfigurasi lengkap PrivateKey, mis. Bukan hanya komponen PublicKey.

Jika Anda hanya menggunakan RSA256 untuk memverifikasi tanda tangan JWT alih-alih mengenkripsi token jwe dan jwtAuth.IsJwtValid(jwt) mengembalikan false, Anda dapat memverifikasi apakah tanda tangan valid dengan menelepon GetVerifiedJwtPayload(), mis.

var jwtBody = jwtAuth.GetVerifiedJwtPayload(null, jwt.Split('.'));

Ini akan mengembalikan null Jika verifikasi tanda tangan gagal jika tidak akan mengembalikan JsonObject dengan isi tubuh JWT.

Anda kemudian dapat memvalidasi muatan jwtbody untuk memeriksa apakah jwt valid, mis.:

var invalidErrorMessage = jwtAuth.GetInvalidJwtPayloadError(jwtBody);
var jwtIsValid = invalidError == null;

Yang mengembalikan null Jika jwt valid jika tidak, pesan kesalahan string mengapa tidak.

1
mythz 5 April 2021, 16:41