ASP.NET CORE 6: Fügen Sie mehrere Authentifizierungsschemata mit mehreren Autorisierungsrichtlinien zusammen mit AbhängiC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 ASP.NET CORE 6: Fügen Sie mehrere Authentifizierungsschemata mit mehreren Autorisierungsrichtlinien zusammen mit Abhängi

Post by Anonymous »

Ich muss ein Framework für Mitarbeiter erstellen, das mehrere Authentifizierungsschemata und die Korrelation von Autorisierungsrichtlinien ermöglicht (da unser IDP mehrere zulässige Ansätze hat) . Die Authentifizierung erfolgt mit einem JWT -Trägertoken in den Fällen, mit denen ich bisher arbeite. Es sieht also so aus oder Endpunkt kann mit der AutorizeAttribute dekoriert werden und verwendet die benannte Standardrichtlinie, die das benannte Standard -Authn -Schema verwendet. Wenn das Attribut Konstruktorparameter von Policy = oder AuthentifizierungSchemes = erhält, wechselt es stattdessen zu diesen.
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);
}
}
und ich wiederholten dieses Muster für eine Klasse namens clientcredentialsJwtbearerOptions , aber ich habe diese Variation

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 
und die Anforderung geht durch.

Code: Select all

[Authorize(Policy = "ClientCredentialsOnly")]
Authentifizierung verwendet weiterhin AuthCodeJWTbearerOptions . Ich kann es zum Wechseln bringen, indem ich einfach die Reihenfolge der Konfiguration aufrufen
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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post