当使用在 jwt 持有者处理程序中配置的不同别名访问站点时,验证颁发者失败



我有使用 jwt 持有者身份验证的 web api。创建 jwt 的实现 (openiddict) 使用当前 url 作为颁发者。

services
.AddOpenIddict()
.UseJsonWebTokens();

我将 jwt 身份验证处理程序配置为使用有效的颁发者。

services
.AddAuthentication()
.AddJwtBearer(options =>
{
options.Authority = "http://test/";
...
});

当我到达http://test/下的站点时,我得到一个访问令牌,颁发者设置为http://test/。当Authority与颁发者匹配时,将对请求进行身份验证。

当我到达http://125.124.35.21/下的站点时,我得到一个访问令牌,颁发者设置为http://125.124.35.21/。由于Authority与颁发者不匹配,因此不会对请求进行身份验证。

我希望在这两种情况下都能够对请求进行身份验证。

现在我看到根据 jwt rfc,iss声明是可选的。

我的问题是我是否可以为此目的将ValidateIssuer设置为 false,如果我在这样做时打开一个安全漏洞,是否有更推荐的替代方案?

services
.AddAuthentication()
.AddJwtBearer(options =>
{
options.Authority = "http://test/";
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
...
}
});

哪种配置用于解析.well-known/openid-configurationAuthority?希望不是发行者,因为这意味着每个人都可以发行代币并将其与我的 API 一起使用。

我查看了生成访问令牌的代码,发现它仅在未设置配置值时采用当前 uri。

https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/blob/120a7ea9a14a33fad292cf4a11b4077118fab21f/src/AspNet.Security.OpenIdConnect.Server/OpenIdConnectServerHelpers.cs#L198

public static string GetIssuer(this HttpContext context, OpenIdConnectServerOptions options)
{
var issuer = options.Issuer;
if (issuer == null)
{
if (!Uri.TryCreate(context.Request.Scheme + "://" + context.Request.Host +
context.Request.PathBase, UriKind.Absolute, out issuer))
{
throw new InvalidOperationException("The issuer address cannot be inferred from the current request");
}
}
return issuer.AbsoluteUri;
}

因此,当我配置 openiddict 时,我可以设置Issuer属性。

services.AddOpenIddict()
...
.Configure(options =>
{
options.Issuer = "http://test/";
...
});

当我添加身份验证服务时,我也可以只设置Authority属性。

services
.AddAuthentication()
.AddJwtBearer(options =>
{
options.Authority = "http://test/";
...
});

似乎当没有配置有效的颁发者时,会采取Authority来验证颁发者。但我没有找到支持这种说法的代码。

也许它隐藏在Microsoft.IdentityModel.Protocols.OpenIdConnect.dll

另一种选择是将ValidateIssuer设置为false


正如 JWT RFC 所说,iss(发行者)声明是可选的。

"iss"(发行人)声明标识发出 智威汤逊。 该索赔的处理通常是针对特定应用的。 "iss"值是一个区分大小写的字符串,其中包含一个字符串或URI 价值。使用此声明是可选的。


OAuth 2.0 RFC 根本没有提到颁发者或令牌的格式。


用于解析.well-known/openid-configuration的 uri 由MetadataAddress属性配置。如果未设置此属性,则似乎使用Authority属性来构建 uri。

https://github.com/aspnet/Security/blob/b3e4bf382c9676e2d912636b7ee0255cad244e11/src/Microsoft.AspNetCore.Authentication.JwtBearer/JwtBearerPostConfigureOptions.cs#L37

if (string.IsNullOrEmpty(options.MetadataAddress) && !string.IsNullOrEmpty(options.Authority))
{
options.MetadataAddress = options.Authority;
if (!options.MetadataAddress.EndsWith("/", StringComparison.Ordinal))
{
options.MetadataAddress += "/";
}
options.MetadataAddress += ".well-known/openid-configuration";
}

由于用于验证令牌的公钥存储在以MetadataAddress为前缀的.well-known/jwks文件中,因此应该保存以忽略此声明,如果您不想排除所有发行者共享相同配置文件的某些颁发者。但我想不出这样的情况。

另一种解决方案是在TokenValidationParametersValidIssuers属性中包含所有已知的别名。但我认为这不是一个好主意,因为您可能会忘记一些别名。

例如,在不同的子网中,您可能可以使用不同的 IP 或不同的 DNS 别名访问服务。

相关内容

  • 没有找到相关文章

最新更新