Я пытаюсь отправить JWT в мою политику проверяющей стороны и на нее ссылаются через <InputTokenFormat>JWT</InputTokenFormat>
, но мне трудно получить B2C для проверки токена.Интересно, кто-нибудь может определить проблему.
Ошибка
Возвращается из B2C после вызова конечной точки авторизации и передачи client_assertion в строке запроса:
AADB2C90017:Клиентское утверждение, указанное в запросе, недопустимо: в качестве ключа проверки использовался «client_secret»
Client_secret - это секрет подписи, созданный вручную в области политики IEF для совместного использования с приложением.Но, честно говоря, я не могу сказать, является ли эта ошибка просто полезным фактом: «client_secret» - это ключ, с помощью которого политика пытается проверить, ИЛИ говорит мне , почему запрос недействителен: 'client_secret"неправильно использовался в качестве ключа подтверждения.
Из приложения Insights
{
"Key": "Exception",
"Value": {
"Kind": "Handled",
"HResult": "80131500",
"Message": "The client assertion provided in the request is invalid: 'client_secret' was used as the verification key",
"Data": {
"IsPolicySpecificError": false
},
"Exception": {
"Kind": "Handled",
"HResult": "80131500",
"Message": "The validation of the JWT failed. Reason: jwt format",
"Data": {}
}
}
Декодированный JWT : (обратите внимание, что инструкция aud
идентификатор клиента моего приложения)
{
"alg": "HS256",
"typ": "JWT"
}
.{
"verified_email": "markarnolditpro@gmail.com",
"nbf": 1554098875,
"exp": 1554530875,
"iat": 1554098875,
"iss": "https=mytenant.b2clogin.com/34d8169d-0e97-4cc7-a8d0-57c29404f1b1/v2.0/",
"aud": "7c93185b-05c7-4d72-b8c9-bd62e7bfefc5"
}
.[Signature]
URL-адрес политики:
https://mytenant.b2clogin.com/mytenant.onmicrosoft.com/oauth2/v2.0/authorize?p=B2C_1A_Invitation
&client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer
&client_assertion=<JWT base64 header.body.signature>
&client_id=7c93185b-05c7-4d72-b8c9-bd62e7bfefc5
&response_mode=form_post
&response_type=id_token
&redirect_uri=http://localhost:34647/
&scope=openid
&nonce=123123123sdfsdfsdf
Подпись
I 'я создал ключ IEF, сгенерировал вручную, подписал секрет и поделился значением с приложением. Я ссылаюсь на ключ из политики проверяющей части следующим образом: <Key Id="client_secret" StorageReferenceId="B2C_1A_ADB2CMgtAPISecret" />
Создать маркер
Этот код по большей части взят из приложения WingTipGames
private static string CreateSelfIssuedToken(
string issuer,
string audience,
TimeSpan expiration,
string signingSecret,
ICollection<Claim> claims)
{
var tokenHandler = new JwtSecurityTokenHandler();
var nowUtc = DateTime.UtcNow;
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(signingSecret));
var signingCredentials = new SigningCredentials(key, "http://www.w3.org/2001/04/xmldsig-more#hmac-sha256");
var tokenDescriptor = new SecurityTokenDescriptor
{
Audience = audience,
Expires = nowUtc.Add(expiration),
IssuedAt = nowUtc,
Issuer = issuer,
NotBefore = nowUtc,
SigningCredentials = signingCredentials,
Subject = new ClaimsIdentity(claims)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
Я уверен, что для подписи и проверки JWT используется один и тот же секрет подписи. Но яя действительно стреляю вслепую как конкретный формат jwt, который нужен. Есть мысли? Пока я думаю:
- простая проблема urlEncoding где-то
- проблема с синхронизацией часов между клиентом и сервером
- Я пропускаю некоторые утверждения, или они неправильно указаны в токене
Спасибо Марк