Das Client
in der IdentityServer4-Autorisierungskonfiguration AllowedScopes
legt den spezifischen API-Site-Namen fest, der dem ApiName
entspricht, der vom Benutzer festgelegt wurde:
//授权中心配置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});
Die beiden oben genannten api_name1
-Konfigurationen müssen konsistent sein. Das Problem entsteht, weil die scope
-Konfiguration des Autorisierungscenters der gesamte API-Dienst ist. Wenn wir mehrere Client
-Konfigurationen haben, z Wenn es ein Frontend und ein Backend gibt und beide auf api_name1
zugreifen müssen, treten einige Probleme auf.
Zum Beispiel der Konfigurationscode eines Schnittstellendienstes im api_name1
-Dienst:
[Authorize()] [Route("api/values")] [HttpGet]public IActionResult Get() {return Ok(); }
Authorize()
-Konfiguration, der angibt, dass die api/values
-Schnittstelle Für den Zugriff ist eine Autorisierung erforderlich. Wenn das Autorisierungscenter mit zwei Client
(Frontend und Backend) konfiguriert ist und beide scope
api_name1
enthalten, gibt es jetzt zwei Situationen:
Frontend< Sowohl 🎜> als auch das Backend Client
müssen für den Zugriff auf die Client
-Schnittstelle berechtigt sein: kein Problem. api/values
erfordert keine Autorisierung für den Zugriff, und Back-End Client
erfordert Autorisierung für den Zugriff: Es liegt ein Problem vor, das Front-End Client
kann nicht darauf zugreifen, da die Client
-Schnittstelle eingestellt ist api/values
. Authorize()
angeben, um den Zugriff zu autorisieren? Zum Beispiel: Client
. [Authorize(ClientId = 'client_id_1')]
Lösung, aber Sie können [Authorize(ClientId = 'client_id_1')]
verwenden. [Authorize(Roles = 'admin')]
-Code des Autorisierungszentrums wird wie folgt geändert: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); } } }
Konfiguration des Autorisierungszentrums wird wie folgt geändertstartup
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());
[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(); }
-Schnittstelle hat keinen spezifischen api/values
-Satz, zugänglich für jeden Roles
. Role
Das obige ist der detaillierte Inhalt vonIdentityServer4-Autorisierungskonfiguration AllowedScopes-Instanz. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!