Erstellen sicherer .NET-Microservices und -WebanwendungenMake secure .NET Microservices and Web Applications

Das Thema Sicherheit in Microservices und Webanwendungen hat so viele Aspekte, dass zu seiner Behandlung gleich mehrere Bücher wie dieses erforderlich wären – daher wollen wir uns in diesem Abschnitt auf Authentifizierung, Autorisierung und Anwendungsgeheimnisse konzentrieren.There are so many aspects about security in microservices and web applications that the topic could easy take several books like this one so, in this section, we'll focus on authentication, authorization, and application secrets.

Implementieren von Authentifizierung in .NET-Microservices und -WebanwendungenImplement authentication in .NET microservices and web applications

Ressourcen und APIs, die durch einen Dienst veröffentlicht wurden, müssen oftmals auf bestimmte vertrauenswürdige Benutzer oder Clients beschränkt werden.It's often necessary for resources and APIs published by a service to be limited to certain trusted users or clients. Der erste Schritt zur Durchführung dieser Entscheidungen über die Vertrauenswürdigkeit auf API-Ebene ist die Authentifizierung.The first step to making these sorts of API-level trust decisions is authentication. Authentifizierung bezeichnet den Vorgang der zuverlässigen Überprüfung der Identität eines Benutzers.Authentication is the process of reliably verify a user’s identity.

In Microservice-Szenarios wird die Authentifizierung in der Regel zentral verarbeitet.In microservice scenarios, authentication is typically handled centrally. Wenn Sie ein API-Gateway verwenden, ist dieses Gateway ein guter Ort, um die Authentifizierung durchzuführen, so wie in Abbildung 9-1 dargestellt.If you're using an API Gateway, the gateway is a good place to authenticate, as shown in Figure 9-1. Wenn Sie nach diesem Ansatz vorgehen, stellen Sie sicher, dass die einzelnen Microservices nicht direkt (ohne das API-Gateway) erreicht werden können, außer es kann zusätzliche Sicherheit garantiert werden, um Benachrichtigen danach zu authentifizieren, ob sie vom Gateway stammen oder nicht.If you use this approach, make sure that the individual microservices cannot be reached directly (without the API Gateway) unless additional security is in place to authenticate messages whether they come from the gateway or not.

Das folgenden Diagramm zeigt, wie die mobile Client-App mit dem Back-End interagiert.

Abbildung 9-1.Figure 9-1. Zentrale Authentifizierung mit einem API-GatewayCentralized authentication with an API Gateway

Wenn die Authentifizierung im API-Gateway zentralisiert ist, fügt dieses Anforderungen beim Weiterleiten an die Microservices Benutzerinformationen hinzu.When the API Gateway centralizes authentication, it adds user information when forwarding requests to the microservices. Wenn auf Dienste direkt zugegriffen werden kann, kann ein Authentifizierungsdienst wie Azure Active Directory oder ein dedizierter Authentifizierungs-Microservice, der als Sicherheitstokendienst (STS) fungiert, zum Authentifizieren von Benutzern verwendet werden.If services can be accessed directly, an authentication service like Azure Active Directory or a dedicated authentication microservice acting as a security token service (STS) can be used to authenticate users. Entscheidungen über die Vertrauenswürdigkeit werden zwischen Diensten mit Sicherheitstoken oder Cookies freigegeben.Trust decisions are shared between services with security tokens or cookies. (Diese Token können bei Bedarf zwischen ASP.NET Core-Anwendungen durch Implementierung der gemeinsamen Nutzung von Cookies freigegeben werden.) Dieses Muster ist in Abbildung 9-2 dargestellt.(These tokens can be shared between ASP.NET Core applications, if needed, by implementing cookie sharing.) This pattern is illustrated in Figure 9-2.

Das folgende Diagramm zeigt die Authentifizierung durch Back-End-Microservices.

Abbildung 9-2:Figure 9-2. Authentifizierung durch Identitäts-Microservice; das Vertrauen ist mithilfe eines Autorisierungstokens freigegeben.Authentication by identity microservice; trust is shared using an authorization token

Beim direkten Zugriff auf Microservices wird die Vertrauensstellung, die Authentifizierung und Autorisierung beinhaltet, mithilfe eines Sicherheitstokens behandelt, das von einem von den Microservices gemeinsam verwendeten, dedizierten Microservice herausgegeben wird.When microservices are accessed directly, trust, that includes authentication and authorization, is handled by a security token issued by a dedicated microservice, shared between microservices.

Authentifizierung mit ASP.NET Core IdentityAuthenticate with ASP.NET Core Identity

Der primäre Mechanismus in ASP.NET Core zur Identifizierung eines Anwendungsbenutzers ist das Mitgliedschaftssystem ASP.NET Core Identity.The primary mechanism in ASP.NET Core for identifying an application’s users is the ASP.NET Core Identity membership system. ASP.NET Core Identity speichert Benutzerinformationen (einschließlich Anmeldeinformationen, Rollen und Ansprüche) in einem Datenspeicher, der vom Entwickler konfiguriert wurde.ASP.NET Core Identity stores user information (including sign-in information, roles, and claims) in a data store configured by the developer. Normalerweise ist der ASP.NET Core Identity-Datenspeicher ein Entity Framework-Speicher, der im Microsoft.AspNetCore.Identity.EntityFrameworkCore-Paket bereitgestellt wird.Typically, the ASP.NET Core Identity data store is an Entity Framework store provided in the Microsoft.AspNetCore.Identity.EntityFrameworkCore package. Jedoch können benutzerdefinierte Speicher oder andere Pakete von Drittanbietern zum Speichern von Identitätsinformationen in Azure Table Storage, CosmosDB oder anderen Speicherorten verwendet werden.However, custom stores or other third-party packages can be used to store identity information in Azure Table Storage, CosmosDB, or other locations.

Tipp

ASP.NET Core 2.1 und höher stellt ASP.NET Core Identity als Razor-Klassenbibliothek bereit, sodass Sie in Ihrem Projekt nicht viel vom notwendigen Code sehen werden, so wie es in den vorherigen Versionen der Fall war.ASP.NET Core 2.1 and later provides ASP.NET Core Identity as a Razor Class Library, so you won't see much of the necessary code in your project, as was the case for previous versions. Ausführliche Informationen zum Anpassen des Codes für Identity an Ihre Anforderungen finden Sie unter Erstellen eines Identity-Gerüsts in ASP.NET Core-Projekten.For details on how to customize the Identity code to suit your needs, see Scaffold Identity in ASP.NET Core projects.

Der folgende Code entstammt der Projektvorlage „ASP.NET Core Web Application MVC 3.1“, für die die Authentifizierung mit einem einzelnen Benutzerkonto ausgewählt ist.The following code is taken from the ASP.NET Core Web Application MVC 3.1 project template with individual user account authentication selected. Der Code veranschaulicht, wie Sie ASP.NET Core Identity mithilfe von Entity Framework Core in der Startup.ConfigureServices-Methode konfigurieren.It shows how to configure ASP.NET Core Identity using Entity Framework Core in the Startup.ConfigureServices method.

public void ConfigureServices(IServiceCollection services)
{
    //...
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddRazorPages();
    //...
}

Wenn ASP.NET Core Identity konfiguriert ist, erfolgt die Aktivierung, indem Sie app.UseAuthentication() und endpoints.MapRazorPages() der Startup.Configure-Methode des Diensts hinzufügen, wie im folgenden Code gezeigt:Once ASP.NET Core Identity is configured, you enable it by adding the app.UseAuthentication() and endpoints.MapRazorPages() as shown in the following code in the service's Startup.Configure method:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    //...
    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
    //...
}

Wichtig

Die Zeilen im obigen Code MÜSSEN DIE GEZEIGTE REIHENFOLGE AUFWEISEN, damit Identity ordnungsgemäß funktioniert.The lines in the preceeding code MUST BE IN THE ORDER SHOWN for Identity to work correctly.

Durch die Verwendung von ASP.NET Core Identity sind mehrere Szenarios möglich:Using ASP.NET Core Identity enables several scenarios:

  • Erstellen Sie neue Benutzerinformationen mithilfe des UserManager-Typs (userManager.CreateAsync).Create new user information using the UserManager type (userManager.CreateAsync).

  • Authentifizieren Sie Benutzer mithilfe des SignInManager-Typs.Authenticate users using the SignInManager type. Sie können signInManager.SignInAsync für die direkte Anmeldung verwenden oder mithilfe von signInManager.PasswordSignInAsync die Richtigkeit des Benutzerkennworts bestätigen und diesen anschließend anmelden.You can use signInManager.SignInAsync to sign in directly, or signInManager.PasswordSignInAsync to confirm the user’s password is correct and then sign them in.

  • Identifizieren Sie einen Benutzer auf Grundlage von Informationen, die in einem Cookie gespeichert sind (das von der ASP.NET Core Identity-Middleware gelesen wird), damit nachfolgende Anforderungen von einem Browser die Identität und Ansprüche eines angemeldeten Benutzers enthalten.Identify a user based on information stored in a cookie (which is read by ASP.NET Core Identity middleware) so that subsequent requests from a browser will include a signed-in user’s identity and claims.

ASP.NET Core Identity unterstützt auch die zweistufige Authentifizierung.ASP.NET Core Identity also supports two-factor authentication.

ASP.NET Core Identity ist eine empfohlene Lösung für Authentifizierungsszenarios, die einen Datenspeicher für lokale Benutzerdaten verwenden und die Identität zwischen Anforderungen mithilfe von Cookies (was typisch für MVC-Webanwendungen ist) beibehalten.For authentication scenarios that make use of a local user data store and that persist identity between requests using cookies (as is typical for MVC web applications), ASP.NET Core Identity is a recommended solution.

Authentifizierung mithilfe externer AnbieterAuthenticate with external providers

ASP.NET Core unterstützt auch die Verwendung von externen Authentifizierungsanbietern, damit sich Benutzer über OAuth 2.0-Flows anmelden können.ASP.NET Core also supports using external authentication providers to let users sign in via OAuth 2.0 flows. Das bedeutet, dass sich Benutzer mithilfe von vorhandenen Authentifizierungsprozessen von Anbietern wie Microsoft, Google, Facebook oder Twitter anmelden können und diese Identitäten ASP.NET Core Identity in Ihrer Anwendung zuordnen können.This means that users can sign in using existing authentication processes from providers like Microsoft, Google, Facebook, or Twitter and associate those identities with an ASP.NET Core identity in your application.

Um eine externe Authentifizierung zu verwenden, müssen Sie zum einen, wie bereits erwähnt, mithilfe der app.UseAuthentication()-Methode die Authentifizierungsmiddleware einschließen. Zum anderen müssen Sie den externen Anbieter in Startup registrieren, wie im folgenden Beispiel gezeigt:To use external authentication, besides including the authentication middleware as mentioned before, using the app.UseAuthentication() method, you also have to register the external provider in Startup as shown in the following example:

public void ConfigureServices(IServiceCollection services)
{
    //...
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddAuthentication()
        .AddMicrosoftAccount(microsoftOptions =>
        {
            microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ClientId"];
            microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
        })
        .AddGoogle(googleOptions => { ... })
        .AddTwitter(twitterOptions => { ... })
        .AddFacebook(facebookOptions => { ... });
    //...
}

Beliebte externe Authentifizierungsanbieter sowie deren zugeordnete NuGet-Pakete sind in der folgenden Tabelle dargestellt:Popular external authentication providers and their associated NuGet packages are shown in the following table:

AnbieterProvider PaketePackage
MicrosoftMicrosoft Microsoft.AspNetCore.Authentication.MicrosoftAccountMicrosoft.AspNetCore.Authentication.MicrosoftAccount
GoogleGoogle Microsoft.AspNetCore.Authentication.GoogleMicrosoft.AspNetCore.Authentication.Google
FacebookFacebook Microsoft.AspNetCore.Authentication.FacebookMicrosoft.AspNetCore.Authentication.Facebook
TwitterTwitter Microsoft.AspNetCore.Authentication.TwitterMicrosoft.AspNetCore.Authentication.Twitter

In allen Fällen müssen Sie ein Verfahren zur Anwendungsregistrierung durchlaufen, das vom jeweiligen Anbieter abhängig ist und in der Regel folgende Schritte umfasst:In all cases, you must complete an application registration procedure that is vendor dependent and that usually involves:

  1. Sie rufen eine Clientanwendungs-ID ab.Getting a Client Application ID.
  2. Sie rufen einen Clientanwendungsserver ab.Getting a Client Application Secret.
  3. Sie konfigurieren eine Umleitungs-URL, die von der Autorisierungsmiddleware und dem registrierten Anbieter verarbeitet wird.Configuring an redirection URL, that's handled by the authorization middleware and the registered provider
  4. Optional konfigurieren Sie eine Abmelde-URL, um Abmeldungen in einem SSO-Szenario (Single Sign-On, einmaliges Anmelden) ordnungsgemäß zu verarbeiten.Optionally, configuring a sign-out URL to properly handle sign out in a Single Sign On (SSO) scenario.

Ausführliche Informationen zum Konfigurieren Ihrer App für einen externen Anbieter finden Sie in der ASP.NET Core-Dokumentation im Artikel zur Authentifizierung über externe Anbieter.For details on configuring your app for an external provider, see the External provider authentication in the ASP.NET Core documentation).

Tipp

Alle Details werden von den bereits erwähnten Middlewarekomponenten und Diensten zur Autorisierung verarbeitet.All details are handled by the authorization middleware and services previously mentioned. Wenn Sie das ASP.NET Core-Webanwendungsprojekt in Visual Studio erstellen, müssen Sie also zusätzlich zur Registrierung der Authentifizierungsanbieter einfach nur die Authentifizierungsoption Einzelne Benutzerkonten auswählen, wie in Abbildung 9-3 dargestellt.So, you just have to choose the Individual User Account authentication option when you create the ASP.NET Code web application project in Visual Studio, as shown in Figure 9-3, besides registering the authentication providers previously mentioned.

Screenshot des Dialogfelds „Neue ASP.NET Core-Webanwendung“

Abbildung 9-3.Figure 9-3. Auswählen der Option „Einzelne Benutzerkonten“ zur Verwendung der externen Authentifizierung beim Erstellen eines Webanwendungsprojekts in Visual Studio 2019.Selecting the Individual User Accounts option, for using external authentication, when creating a web application project in Visual Studio 2019.

Zusätzlich zu den zuvor aufgeführten externen Authentifizierungsanbietern sind Pakete Dritter verfügbar, die Middleware zur Verwendung mehrerer externer Authentifizierungsanbieter bereitstellen.In addition to the external authentication providers listed previously, third-party packages are available that provide middleware for using many more external authentication providers. Eine Liste finden Sie im AspNet.Security.OAuth.Providers-Repository auf GitHub.For a list, see the AspNet.Security.OAuth.Providers repository on GitHub.

Um besonderen Anforderungen gerecht zu werden, können Sie auch eigene Middleware zur externen Authentifizierung erstellen.You can also create your own external authentication middleware to solve some special need.

Authentifizierung mit BearertokenAuthenticate with bearer tokens

Die Authentifizierung mit ASP.NET Core Identity (oder Identity plus externer Authentifizierunsanbieter) funktioniert für viele Webanwendungsszenarios einwandfrei, für die das Speichern von Benutzerinformationen in einem Cookie geeignet ist.Authenticating with ASP.NET Core Identity (or Identity plus external authentication providers) works well for many web application scenarios in which storing user information in a cookie is appropriate. In anderen Szenarios sind Cookies jedoch kein natürlicher Vorgang zum Beibehalten und Übertragen von Daten.In other scenarios, though, cookies are not a natural means of persisting and transmitting data.

Beispielsweise verwenden Sie in einer ASP.NET Core-Web-API, die RESTful-Endpunkte verfügbar macht, auf die möglicherweise Einzelseitenanwendungen, native Clients oder auch andere Web-APIs zugreifen, stattdessen Bearertoken.For example, in an ASP.NET Core Web API that exposes RESTful endpoints that might be accessed by Single Page Applications (SPAs), by native clients, or even by other Web APIs, you typically want to use bearer token authentication instead. Diese Anwendungstypen funktionieren nicht mit Cookies, können jedoch einfach ein Bearertoken abrufen und dieses in den Autorisierungsheader nachfolgender Anforderungen einfügen.These types of applications do not work with cookies, but can easily retrieve a bearer token and include it in the authorization header of subsequent requests. Für die Tokenauthentifizierung unterstützt ASP.NET Core mehrere Optionen zur Verwendung von OAuth 2.0 und OpenID Connect.To enable token authentication, ASP.NET Core supports several options for using OAuth 2.0 and OpenID Connect.

Authentifizierung mit einem OpenID Connect- und OAuth 2.0-IdentitätsanbieterAuthenticate with an OpenID Connect or OAuth 2.0 Identity provider

Wenn Benutzerinformationen in Azure Active Directory oder einer anderen Identitätslösung gespeichert werden, die OpenID Connect oder OAuth 2.0 verwendet, können Sie das Paket Microsoft.AspNetCore.Authentication.OpenIdConnect für die Authentifizierung mithilfe des OpenID Connect-Workflows verwenden.If user information is stored in Azure Active Directory or another identity solution that supports OpenID Connect or OAuth 2.0, you can use the Microsoft.AspNetCore.Authentication.OpenIdConnect package to authenticate using the OpenID Connect workflow. Um sich z.B. beim Identity.Api-Microservice in eShopOnContainers zu authentifizieren, kann eine ASP.NET Core-Webanwendung, wie in folgendem vereinfachtem Beispiel in Startup.cs gezeigt, Middleware aus diesem Paket verwenden:For example, to authenticate to the Identity.Api microservice in eShopOnContainers, an ASP.NET Core web application can use middleware from that package as shown in the following simplified example in Startup.cs:

// Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //…
    app.UseAuthentication();
    //…
    app.UseEndpoints(endpoints =>
    {
        //...
    });
}

public void ConfigureServices(IServiceCollection services)
{
    var identityUrl = Configuration.GetValue<string>("IdentityUrl");
    var callBackUrl = Configuration.GetValue<string>("CallBackUrl");
    var sessionCookieLifetime = configuration.GetValue("SessionCookieLifetimeMinutes", 60);

    // Add Authentication services

    services.AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddCookie(setup => setup.ExpireTimeSpan = TimeSpan.FromMinutes(sessionCookieLifetime))
    .AddOpenIdConnect(options =>
    {
        options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.Authority = identityUrl.ToString();
        options.SignedOutRedirectUri = callBackUrl.ToString();
        options.ClientId = useLoadTest ? "mvctest" : "mvc";
        options.ClientSecret = "secret";
        options.ResponseType = useLoadTest ? "code id_token token" : "code id_token";
        options.SaveTokens = true;
        options.GetClaimsFromUserInfoEndpoint = true;
        options.RequireHttpsMetadata = false;
        options.Scope.Add("openid");
        options.Scope.Add("profile");
        options.Scope.Add("orders");
        options.Scope.Add("basket");
        options.Scope.Add("marketing");
        options.Scope.Add("locations");
        options.Scope.Add("webshoppingagg");
        options.Scope.Add("orders.signalrhub");
    });
}

Beachten Sie, dass wenn Sie diesen Workflow verwenden, die ASP.NET Core Identity-Middleware nicht erforderlich ist, da der gesamte Speicher und die Authentifizierung der Benutzerinformationen vom Identitätsdienst behandelt werden.Note that when you use this workflow, the ASP.NET Core Identity middleware is not needed, because all user information storage and authentication is handled by the Identity service.

Ausstellen von Sicherheitstoken von einem ASP.NET Core-DienstIssue security tokens from an ASP.NET Core service

Wenn Sie lieber Sicherheitstoken für lokale ASP.NET Core Identity-Benutzer ausstellen möchten, anstatt einen externen Identitätsanbieter zu verwenden, können Sie von einigen guten Bibliotheken von Drittanbietern profitieren.If you prefer to issue security tokens for local ASP.NET Core Identity users rather than using an external identity provider, you can take advantage of some good third-party libraries.

IdentityServer4 und OpenIddict sind OpenID Connect-Anbieter, die sich einfach in ASP.NET Core Identity integrieren lassen, damit Sie Sicherheitstoken von einem ASP.NET Core-Dienst ausstellen können.IdentityServer4 and OpenIddict are OpenID Connect providers that integrate easily with ASP.NET Core Identity to let you issue security tokens from an ASP.NET Core service. Die IdentityServer4-Dokumentation bietet detaillierte Anweisungen zur Verwendung der Bibliothek.The IdentityServer4 documentation has in-depth instructions for using the library. Jedoch sind die grundlegenden Schritte zur Verwendung von IdentityServer4 zur Ausstellung von Token wie folgt.However, the basic steps to using IdentityServer4 to issue tokens are as follows.

  1. Sie können UseIdentityServer in der Startup.Configure-Methode aufrufen, um IdentityServer4 der HTTP_Anforderungsverarbeitungspipeline hinzuzufügen.You call app.UseIdentityServer in the Startup.Configure method to add IdentityServer4 to the application’s HTTP request processing pipeline. Dadurch kann die Bibliothek Anforderungen an OpenID Connect und OAuth2-Endpunkte wie „/connect/token“ verarbeitenThis lets the library serve requests to OpenID Connect and OAuth2 endpoints like /connect/token.

  2. Sie konfigurieren IdentityServer4 in Startup.ConfigureServices, indem Sie services.AddIdentityServer aufrufen.You configure IdentityServer4 in Startup.ConfigureServices by making a call to services.AddIdentityServer.

  3. Sie konfigurieren Identitätsserver, indem Sie folgende Daten bereitstellen:You configure identity server by setting the following data:

    • Die zu verwendenden Anmeldeinformationen für die Registrierung.The credentials to use for signing.

    • Die Identitäts- und API-Ressourcen, auf die Benutzer möglicherweise Zugriff anfordern:The Identity and API resources that users might request access to:

      • API-Ressourcen stellen geschützte Daten oder Funktionen dar, auf die ein Benutzer mit einem Zugriffstoken zugreifen kann.API resources represent protected data or functionality that a user can access with an access token. Ein Beispiel einer API-Ressource wäre eine Web-API (oder ein Satz von APIs), für die die Autorisierung erforderlich ist.An example of an API resource would be a web API (or set of APIs) that requires authorization.

      • Identitätsressourcen stellen Informationen (Ansprüche) dar, die einem Client zur Identifizierung eines Benutzers übergeben werden.Identity resources represent information (claims) that are given to a client to identify a user. Die Ansprüche können den Benutzernamen, die E-Mail-Adresse usw. beinhalten.The claims might include the user name, email address, and so on.

    • Die Clients, die eine Verbindung herstellen, um Token anzufordern.The clients that will be connecting in order to request tokens.

    • Der Speichermechanismus für Benutzerinformationen, z.B. ASP.NET Core Identity oder eine Alternative.The storage mechanism for user information, such as ASP.NET Core Identity or an alternative.

Wenn Sie Clients und Ressourcen angeben, die IdentityServer4 verwenden sollen, können Sie eine IEnumerable<T>-Auflistung der geeigneten Typen an Methoden übergeben, die einen In-Memory-Client oder Ressourcenspeicher übernehmen.When you specify clients and resources for IdentityServer4 to use, you can pass an IEnumerable<T> collection of the appropriate type to methods that take in-memory client or resource stores. Für komplexere Szenarios können Sie auch Client- oder Ressourcenanbietertypen über eine Abhängigkeitsinjektion nutzen.Or for more complex scenarios, you can provide client or resource provider types via Dependency Injection.

Eine Beispielkonfiguration für IdentityServer4 zur Verwendung von In-Memory-Ressourcen und -Clients, die von einem benutzerdefinierten IClientStore-Typen bereitgestellt werden, könnten wie folgt aussehen:A sample configuration for IdentityServer4 to use in-memory resources and clients provided by a custom IClientStore type might look like the following example:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    //...
    services.AddSingleton<IClientStore, CustomClientStore>();
    services.AddIdentityServer()
        .AddSigningCredential("CN=sts")
        .AddInMemoryApiResources(MyApiResourceProvider.GetAllResources())
        .AddAspNetIdentity<ApplicationUser>();
    //...
}

Nutzen von SicherheitstokenConsume security tokens

Die Authentifizierung bei einem OpenID Connect-Endpunkt oder die Ausstellung Ihrer eigenen Sicherheitstoken deckt einige Szenarios ab.Authenticating against an OpenID Connect endpoint or issuing your own security tokens covers some scenarios. Was ist jedoch mit dem Dienst, der einfach nur den Zugriff für jene Benutzer einschränken muss, die über gültige Sicherheitstoken verfügen, die von einem anderen Dienst bereitgestellt wurden?But what about a service that simply needs to limit access to those users who have valid security tokens that were provided by a different service?

Für dieses Szenario ist die Middleware zur Authentifizierung, die JWT-Token behandelt, im Microsoft.AspNetCore.Authentication.JwtBearer-Paket verfügbar.For that scenario, authentication middleware that handles JWT tokens is available in the Microsoft.AspNetCore.Authentication.JwtBearer package. JWT steht für „JSON Web Token“ und ist ein allgemeines Sicherheitstokenformat (definiert von RFC 7519) zum Kommunizieren von Sicherheitsansprüchen.JWT stands for "JSON Web Token" and is a common security token format (defined by RFC 7519) for communicating security claims. Vereinfacht sieht ein Beispiel zur Verwendung von Middleware zur Nutzung solcher Token etwa wie dieses Codefragment aus, das dem Ordering.Api-Microservice von eShopOnContainers entnommen ist.A simplified example of how to use middleware to consume such tokens might look like this code fragment, taken from the Ordering.Api microservice of eShopOnContainers.

// Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //…
    // Configure the pipeline to use authentication
    app.UseAuthentication();
    //…
    app.UseEndpoints(endpoints =>
    {
        //...
    });
}

public void ConfigureServices(IServiceCollection services)
{
    var identityUrl = Configuration.GetValue<string>("IdentityUrl");

    // Add Authentication services

    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = AspNetCore.Authentication.JwtBearer.JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = AspNetCore.Authentication.JwtBearer.JwtBearerDefaults.AuthenticationScheme;

    }).AddJwtBearer(options =>
    {
        options.Authority = identityUrl;
        options.RequireHttpsMetadata = false;
        options.Audience = "orders";
    });
}

Die Parameter hier sind:The parameters in this usage are:

  • Audience stellt den Empfänger des eingehenden Tokens oder der Ressource dar, für die das Token den Zugriff erteilt.Audience represents the receiver of the incoming token or the resource that the token grants access to. Wenn der in diesem Wert angegebene Parameter nicht mit dem Parameter im Token übereinstimmt, wird das Token abgelehnt.If the value specified in this parameter does not match the parameter in the token, the token will be rejected.

  • Authority ist die Adresse des Authentifizierungsservers, der Token ausgibt.Authority is the address of the token-issuing authentication server. Die Middleware zur JWT-Bearerauthentifizierung verwendet diesen URI, um den öffentlichen Schlüssel abzurufen, der zur Überprüfung der Tokensignatur verwendet werden kann.The JWT bearer authentication middleware uses this URI to get the public key that can be used to validate the token's signature. Die Middleware bestätigt auch, dass der iss-Parameter im Token mit diesem URI übereinstimmt.The middleware also confirms that the iss parameter in the token matches this URI.

Ein weiterer Parameter, RequireHttpsMetadata, ist für Testzwecke nützlich: Sie legen diesen Parameter auf FALSE fest, damit Sie Tests in Umgebungen durchführen können, in denen Sie keine Zertifikate besitzen.Another parameter, RequireHttpsMetadata, is useful for testing purposes; you set this parameter to false so you can test in environments where you don't have certificates. In realen Bereitstellungen dürfen JWT-Bearertoken immer nur über HTTPS übergeben werden.In real-world deployments, JWT bearer tokens should always be passed only over HTTPS.

Wenn diese Middleware vorhanden ist, werden JWT-Token automatisch aus Autorisierungsheadern extrahiert.With this middleware in place, JWT tokens are automatically extracted from authorization headers. Sie werden anschließend deserialisiert, überprüft (mithilfe der Werte in den Parametern Audience und Authority) und als Benutzerinformation gespeichert, auf die später durch MVC-Aktionen oder Autorisierungsfilter verwiesen werden soll.They are then deserialized, validated (using the values in the Audience and Authority parameters), and stored as user information to be referenced later by MVC actions or authorization filters.

Die Middleware für die JWT-Bearerauthentifizierung kann auch erweiterte Szenarios unterstützen, beispielsweise die Verwendung eines lokalen Zertifikats zur Überprüfung eines Tokens, wenn die Registrierungsstelle nicht verfügbar ist.The JWT bearer authentication middleware can also support more advanced scenarios, such as using a local certificate to validate a token if the authority is not available. Für dieses Szenario können Sie ein TokenValidationParameters-Objekt im JwtBearerOptions-Objekt angeben.For this scenario, you can specify a TokenValidationParameters object in the JwtBearerOptions object.

Zusätzliche RessourcenAdditional resources