Erstens habe ich festgestellt, dass ich die Abhängigkeitsinjektion verwenden musste, also verwende ich iConfigureNamedOptions . /p>
Code: Select all
public class AuthCodeJwtBearerOptions : IConfigureNamedOptions
{
private readonly IClaimsTransformation _claimsTransformation;
private readonly ConfigurationManager _configurationManager;
public AuthCodeJwtBearerOptions(IOptions tidV4OAuthOptions,
IClaimsTransformation claimsTransformation)
{
_claimsTransformation = claimsTransformation;
_configurationManager =
new ConfigurationManager(tidV4OAuthOptions.Value.WellknownUrl,
new OpenIdConnectConfigurationRetriever());
}
public void Configure(JwtBearerOptions options) => Configure("AuthCode", options);
public void Configure(string name, JwtBearerOptions options)
{
var task = Task.Run(async () => await GetTokenValidationParametersAsync());
options.TokenValidationParameters = task.Result;
options.Events = new JwtBearerEvents { OnTokenValidated = OnTokenValidated };
}
private async Task GetTokenValidationParametersAsync()
{
var cancellationToken = new CancellationToken();
var openIdConnectConfiguration = await _configurationManager.GetConfigurationAsync(cancellationToken);
return new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKeys = openIdConnectConfiguration?.SigningKeys,
ValidateAudience = false,
ValidateIssuer = true,
ValidIssuer = openIdConnectConfiguration?.Issuer,
ValidateLifetime = true
};
}
private async Task OnTokenValidated(TokenValidatedContext context)
{
if (context.Principal == null)
{
return;
}
context.Principal = await _claimsTransformation.TransformAsync(context.Principal);
}
}
Code: Select all
public void Configure(JwtBearerOptions options) => Configure("ClientCredentials", options);
< /code>
Ich registriere all dies, indem du das Standardauthentifizierungsschema einstellst, die JWT -Träger mit einem leeren Delegierten hinzufügen, und dann rufe ich an, um die Optionen zu konfigurieren. < /p>
Dann weise ich Richtlinien zu. Ich mag falsch liegen, aber ich glaube nichtserviceCollection
.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = "AuthCode";
options.DefaultChallengeScheme = "AuthCode";
})
.AddJwtBearer("AuthCode", _ => { })
.AddJwtBearer("ClientCredentials", _ => { });
serviceCollection.ConfigureOptions();
serviceCollection.ConfigureOptions();
serviceCollection.AddAuthorization(options =>
{
var authCodePolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("AuthCode")
.Build();
var clientCredentialsPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("ClientCredentials")
.Build();
var allPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes("AuthCode", "ClientCredentials")
.Build();
options.AddPolicy("AuthCodeOnly", authCodePolicy);
options.AddPolicy("ClientCredentialsOnly", clientCredentialsPolicy);
options.AddPolicy( "AllPolicies", allPolicy);
options.DefaultPolicy = authCodePolicy;
});
< /code>
Ich verwende Konstanten für die Saiten hier, aber ich habe wörtliche Zeichenfolgen geschrieben, um das Beispiel zu lesen. Gut, wenn ich es genau so lasse. Und es verwendet die AuthCodejwtbearerOptions
Code: Select all
[Authorize(Policy = "ClientCredentialsOnly")]
umkehren kannserviceCollection.ConfigureOptions();
serviceCollection.ConfigureOptions();
< /code>
schlägt mir vor, dass es nur die zuletzte verwendet wird, die registriert wird und die "Named" -Funktionalität benannter Konfigurationen nicht respektiert. < /p>
und Wenn ich die Standardrichtlinie ändere, ändert sich nichts. > tut. < /p>
Jede Hilfe wird geschätzt. Danke.