Maison > développement back-end > Tutoriel C#.Net > Configuration des autorisations IdentityServer4, instance AllowedScopes

Configuration des autorisations IdentityServer4, instance AllowedScopes

零下一度
Libérer: 2017-06-24 10:48:34
original
3477 Les gens l'ont consulté

1. Scénario commercial

Le Client dans la configuration de l'autorisation IdentityServer4 AllowedScopes définit le nom du site API spécifique, qui est le ApiName défini par l'utilisateur. Exemple de code :

//授权中心配置new Client
{
    ClientId = "client_id_1",
    AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
    AllowOfflineAccess = true,
    AccessTokenLifetime = 3600 * 6, //6小时SlidingRefreshTokenLifetime = 1296000, //15天ClientSecrets =
    {new Secret("secret".Sha256())
    },
    AllowedScopes = 
    {"api_name1"},
}//API 服务配置app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
{
    Authority = $"http://localhost:5000",
    ApiName = "api_name1",
    RequireHttpsMetadata = false});
Copier après la connexion
Les deux

configurations ci-dessus doivent être cohérentes. Le problème se pose car la configuration api_name1 du centre d'autorisation est l'ensemble du service API. Si nous avons plusieurs scope configurations, telles. comme s'il y a un frontend et un backend, et que les deux doivent accéder à Client, certains problèmes surgiront. api_name1

Par exemple, le code de configuration d'un service d'interface dans le service

 : configuration api_name1

[Authorize()]
[Route("api/values")]
[HttpGet]public IActionResult Get()
{return Ok();
}
Copier après la connexion

, indiquant que l'interface Authorize() nécessite une autorisation d'accès, si le centre d'autorisation est configuré avec deux api/values (frontend et backend), et que les deux Client incluent scope, il y aura maintenant deux situations : api_name1

  1. frontend

    et le backend Client doivent être autorisés pour accéder à l'interface Client : pas de problème. api/values

  2. Front-end

    ne nécessite pas d'autorisation pour l'accès, et le back-end Client nécessite une autorisation pour l'accès : Il y a un problème, le front-end Client ne peut pas y accéder car l'interface Client est paramétrée api/values. Authorize()

En fait, pour l'expliquer plus clairement, comment laisser le service API spécifier

pour autoriser l'accès ? Par exemple : Client. [Authorize(ClientId = 'client_id_1')]

2. Solution

Il n'y a pas de

solution, mais vous pouvez utiliser [Authorize(ClientId = 'client_id_1')]. [Authorize(Roles = 'admin')]

Le

code du centre d'autorisation est modifié comme suit :ResourceOwnerPasswordValidator

public class ResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator
{private readonly IUserService _userService;public ResourceOwnerPasswordValidator(IUserService userService)
    {
        _userService = userService;
    }public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
    {var user = await _userService.Login(context.UserName, context.Password);if (user != null)
        {var claims = new List<Claim>() { new Claim("role", "admin") }; //根据 user 对象,设置不同的 rolecontext.Result = new GrantValidationResult(user.UserId.ToString(), OidcConstants.AuthenticationMethods.Password, claims);
        }
    }
}
Copier après la connexion
La

configuration du centre d'autorisation est modifiée comme suitstartup

var builder = services.AddIdentityServer();
builder.AddTemporarySigningCredential()//.AddInMemoryIdentityResources(Config.GetIdentityResources()).AddInMemoryApiResources(new List<ApiResource>
        {new ApiResource("api_name1", "api1"){ UserClaims = new List<string> {"role"}}, //增加 role claimnew ApiResource("api_name2", "api2"){ UserClaims = new List<string> {"role"}}
        })
        .AddInMemoryClients(Config.GetClients());
Copier après la connexion
L'interface du service API doit uniquement être configurée comme suit :

[Authorize()]
[Route("api/values")]
[HttpGet]public IActionResult Get()
{return Ok();
}

[Authorize(Roles = "admin")]
[Route("api/values2")]
[HttpGet]public IActionResult Get2()
{return Ok();
}

[Authorize(Roles = "admin,normal")]
[Route("api/values3")]
[HttpGet]public IActionResult Get3()
{return Ok();
}
Copier après la connexion
Il convient de noter que bien que l'interface

n'a pas d'ensemble api/values spécifique, Accessible à tous Roles. Role

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal