我正在使用可操作的消息(与Outlook Web应用程序)调用逻辑应用程序。因此,我在请求中获得了一个承载令牌:
“操作-授权”:“Bearer eye J0eXai...”
调用堆栈:Outlook web app -> Logic App -> my endpoint hosted in azure
现在,我试图通过www.example.com验证令牌jwt.io,但得到签名无效的问题。所以我试着用JwtSecurityTokenHandler
在c#中验证它。
我试图将https://substrate.office.com/sts/
添加到发行者列表中,但似乎验证甚至没有到达那里。
我使用以下代码验证www.example.com发布的jwt令牌office.com:
bool IsAuthorized(HttpActionContext actionContext)
{
var valid = base.IsAuthorized(actionContext);
// Custom handle for Bearer token, when invalid from base-class
if (!valid && actionContext.Request.Headers.Authorization.Scheme == "Bearer")
{
var jwt = actionContext.Request.Headers.Authorization.Parameter;
var th = new JwtSecurityTokenHandler();
var sjwt = th.ReadToken(jwt) as JwtSecurityToken;
var validationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = false,
//IssuerSigningToken = sjwt,
ValidateActor = false,
ValidateAudience = false,
ValidateIssuer = true,
ValidateLifetime = true,
ValidIssuers = new[] { "https://substrate.office.com/sts/" },
ValidAudiences = new[] {"https://XXX.logic.azure.com"}
};
SecurityToken validatedToken;
try
{
th.ValidateToken(jwt, validationParameters, out validatedToken);
}
catch (Exception ex)
{
return false;
}
}
return valid;
}
下面是我的JWT令牌:
我得到了例外:
IDX10500: Signature validation failed. Unable to resolve SecurityKeyIdentifier: 'SecurityKeyIdentifier
(
IsReadOnly = False,
Count = 2,
Clause[0] = X509ThumbprintKeyIdentifierClause(Hash = 0x818...),
Clause[1] = System.IdentityModel.Tokens.NamedKeySecurityKeyIdentifierClause
)
', ...
虽然我设置了ValidateIssuerSigningKey = false
。
是否有方法将https://substrate.office.com/sts/
接受为有效的颁发者?
2条答案
按热度按时间0qx6xfy61#
异常显示“签名验证失败”。为了解决这个问题,我们不能只将想要的有效发行者添加到
ValidIssuers
,我们需要验证令牌是从发行者本身发行的。特别是对于office.com作为发行者的情况,我在这里找到了预期的密钥(JWK - JSON Web Key):https://substrate.office.com/sts/common/discovery/keys(也称为https://substrate.office.com/sts/common/.well-known/openid-configuration)
下面是工作代码:
在appsettings中,我将来自网站的RSA密钥用于验证令牌,它看起来像:
bvjxkvbb2#
如果您使用的是OAuth规范JWT,那么验证票证的密钥可以通过'http://auth.myApplication.com/.well-know/jwks.json'检索,并且内置的JwtSecurityTokenHandler也可以使用,即使您使用的是旧的System. IdentityModel. Tokens. Jwt,它没有原生内置调用。
OWIN示例:
直接呼叫示例:
这需要一个签名密钥解析器,示例是使用第二个选项,因为这正是我所需要的:
它被烘焙到Microsoft.IdentityModel.Tokens中(参见此处的示例:https://github.com/auth0/auth0-aspnet-owin/blob/master/src/Auth0.Owin.OpenIdConnectSigningKeyResolver/OpenIdConnectSigningKeyResolver.cs)。
如果使用System.IdentityModel.Tokens.Jwt,则需要做更多的工作(请参见此处的示例:https://github.com/NaosProject/Naos.Auth/blob/main/Naos.Auth.Recipes.Jwt/OpenIdConnectKeyResolver.cs)我写了一段代码来完成这个任务,可以直接复制(MIT许可证),也可以使用包'Naos.Auth. Recipes.Jwt'作为mix-in安装。