Introspection OAuth avec dotNet

Introduction

Ce guide explique comment faire fonctionner une API web dotNet core avec IBM Security Verify pour la validation des jetons d'accès OAuth présentés.

Instructions

  1. Créez une nouvelle API web dotnet core (c'est-à-dire dotnet new webapi ).
  2. Ajouter la [bibliothèque IdentityModel.AspNetCore.OAuth2Introspection]
    (https://www.nuget.org/packages/IdentityModel.AspNetCore.OAuth2Introspection/).
  3. Dans Startups.cs, ajoutez ce qui suit :
services.AddAuthentication(OAuth2IntrospectionDefaults.AuthenticationScheme)
        .AddOAuth2Introspection(options =>
         {
             options.ClientId = "xxx-xxxx-xxxx-xxxxxx";
             options.ClientSecret = "xxxxxxx";
             options.IntrospectionEndpoint = "https://{{tenant_url}}/v1.0/endpoint/default/introspect"
            });
  1. Si vous souhaitez utiliser des scopes dans votre API. Définissez différentes politiques et affectez-les aux champs d'application que vous attribuez au client API dans ISV. Voici un exemple de politique nommée Read qui est attribuée si le bearer token a une portée API:Read.
services.AddAuthorization(options =>
{
    options.AddPolicy("Read", policy => policy.RequireClaim("scope", "API:Read"));
});
  1. Dans la méthode Configure(), ajoutez app.UseAuthentication( ) ; et app.UseAuthorization( ); :
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseMiddleware<MyMiddleware>();

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

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
  1. Sur chaque terminal à protéger, ajoutez la balise [Autoriser] et spécifiez les politiques définies à l'étape 4. Par exemple, si le token a la portée API:Read, il a la politique Read, ce qui signifie qu'il est autorisé à utiliser le point de terminaison défini ci-dessous.
[HttpGet]
[Authorize(Policy = "Read")]
public ActionResult Get()
{
    return Ok();
}