・IdentityServer側
ApiScopeへの追加
Config.cs
//scope名-Disp名 new ApiScope("testms", "Access to TestMS API"),
ApiResourceへの追加
Config.cs
//API名-Disp名 new ApiResource("testmsapi", "TestMS API") { //scope名 Scopes = { "testms" } }
Clientの追加
Config.cs
new Client { //id ClientId = "testmsswaggerui", //表示名 ClientName = "TestMS Swagger UI", //暗黙 更新トークン等の高度な機能は無 AllowedGrantTypes = GrantTypes.Implicit, //クライアントがブラウザを介してアクセストークンを受信できるようにするかどうか AllowAccessTokensViaBrowser = true, //トークンまたは認証コードを返すことができるURI RedirectUris = { $"{configuration["TestMSApiUrlExternal"]}/swagger/oauth2-redirect.html" }, //ログアウト後にリダイレクトできるURI PostLogoutRedirectUris = { $"{configuration["TestMSApiUrlExternal"]}/swagger/" }, //対応するスコープ名を追加して、許可されるリソースを指定 AllowedScopes = { "testms" } }
・Client側
Swaggerに認証の追加
Startup.cs-ConfigureServices(IServiceCollection services)
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "eShopOnDapr - TestMSApi", Version = "v1" }); //identityUrl var identityUrlExternal = Configuration.GetValue<string>("IdentityUrlExternal"); //AddSecurityDefinition c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme { Type = SecuritySchemeType.OAuth2, Flows = new OpenApiOAuthFlows() { Implicit = new OpenApiOAuthFlow() { //IdentityUrl Authorization AuthorizationUrl = new Uri($"{identityUrlExternal}/connect/authorize"), //IdentityUrl Token TokenUrl = new Uri($"{identityUrlExternal}/connect/token"), //Scope Scopes = new Dictionary<string, string>() { //Scope名 任意の説明 { "testms", "TestMS API" } } } } }); //OperationFilter c.OperationFilter<AuthorizeCheckOperationFilter>(); });
AuthorizeCheckOperationFilterの追加
AuthorizeCheckOperationFilter .cs
public class AuthorizeCheckOperationFilter : IOperationFilter { public void Apply(OpenApiOperation operation, OperationFilterContext context) { // Check for authorize attribute var hasAuthorize = context.MethodInfo.DeclaringType.GetCustomAttributes(true).OfType<AuthorizeAttribute>().Any() || context.MethodInfo.GetCustomAttributes(true).OfType<AuthorizeAttribute>().Any(); if (!hasAuthorize) return; operation.Responses.TryAdd("401", new OpenApiResponse { Description = "Unauthorized" }); operation.Responses.TryAdd("403", new OpenApiResponse { Description = "Forbidden" }); var oAuthScheme = new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "oauth2" } }; operation.Security = new List<OpenApiSecurityRequirement> { new OpenApiSecurityRequirement { [ oAuthScheme ] = new [] { "testmsapi" } } }; } }
AddAuthentication(認証)の追加
Startup.cs-ConfigureServices(IServiceCollection services)
services.AddAuthorization(options => { options.AddPolicy("ApiScope", policy => { policy.RequireAuthenticatedUser(); policy.RequireClaim("scope", "testms"); }); });
AddAuthorization(認可)の追加
Startup.cs-ConfigureServices(IServiceCollection services)
services.AddAuthorization(options => { options.AddPolicy("ApiScope", policy => { policy.RequireAuthenticatedUser(); //claimType=scope scope名=testms policy.RequireClaim("scope", "testms"); }); });
SwaggerにUIの追加
Startup.cs- Configure(IApplicationBuilder app)
app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "TestMSApi v1"); //IdentityServerのClientID c.OAuthClientId("testmsswaggerui"); //IdentityServerのClientName c.OAuthAppName("TestMS Swagger UI"); });
認証認可の追加
Startup.cs- Configure(IApplicationBuilder app)
app.UseAuthentication(); app.UseAuthorization();