Heim >Backend-Entwicklung >C#.Net-Tutorial >IdentityServer4-Autorisierungskonfiguration AllowedScopes-Instanz

IdentityServer4-Autorisierungskonfiguration AllowedScopes-Instanz

零下一度
零下一度Original
2017-06-24 10:48:343483Durchsuche

1. Geschäftsszenario

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:

  1. Frontend als auch das Backend Client müssen für den Zugriff auf die Client-Schnittstelle berechtigt sein: kein Problem. api/values

  2. Front-End

    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()

Um es genauer zu erklären: Wie kann der API-Dienst tatsächlich

angeben, um den Zugriff zu autorisieren? Zum Beispiel: Client. [Authorize(ClientId = 'client_id_1')]

2. Lösung

Es gibt keine

Lösung, aber Sie können [Authorize(ClientId = 'client_id_1')] verwenden. [Authorize(Roles = 'admin')]

Der

-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);
        }
    }
}
Die

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());
API-Service-Schnittstelle muss nur wie folgt konfiguriert werden:

[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();
}
Es ist zu beachten, dass zwar die

-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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn