ASP.NET CORE3.0 API Swagger+IdentityServer4授权验证
一、配置IdentityServer4服务端
这里介绍两种方法
①直接创建identityserver4的模板,在模板的基础上修改
②创建新项目,自己搭建
第一种
参考 我的identityServer4学习,创建一个identityServer4模板后
修改config文件
public static IEnumerable<IdentityResource> GetIdentityResources() { return new IdentityResource[] { new IdentityResources.OpenId(), new IdentityResources.Profile(), }; } /// <summary> /// API信息 /// </summary> /// <returns></returns> public static IEnumerable<ApiResource> GetApis() { return new[] { new ApiResource("ProjectApiScope", "Demo API with Swagger") }; } /// <summary> /// 客服端信息 /// </summary> /// <returns></returns> public static IEnumerable<Client> GetClients() { return new[] { new Client { ClientId = "projectClient",//客服端名称 ClientName = "Swagger UI for demo_api",//描述 AllowedGrantTypes = GrantTypes.Implicit,//指定允许的授权类型(AuthorizationCode,Implicit,Hybrid,ResourceOwner,ClientCredentials的合法组合)。 AllowAccessTokensViaBrowser = true,//是否通过浏览器为此客户端传输访问令牌 RedirectUris = { "http://localhost:5001/swagger/oauth2-redirect.html" }, AllowedScopes = { "ProjectApiScope" }//指定客户端请求的api作用域。 如果为空,则客户端无法访问 }, }; }
打开Startup.cs文件配置,修改如下:
public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); //配置身份服务器与内存中的存储,密钥,客户端和资源 services.AddIdentityServer() .AddDeveloperSigningCredential() .AddInMemoryApiResources(Config.GetApis())//添加api资源 .AddInMemoryClients(Config.GetClients())//添加客户端 .AddInMemoryIdentityResources(Config.GetIdentityResources())//添加对OpenID Connect的支持 .AddTestUsers(TestUsers.Users); //添加测试用户 } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); //IdentityServe app.UseIdentityServer(); //添加静态资源访问 app.UseStaticFiles(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapDefaultControllerRoute(); }); }
第二种,直接干代码
首先创建一个新的ASP.NET Core项目。
这里选择空白项,新建空白项目
等待创建完成后,右键单击项目中的依赖项选择管理NuGet程序包,搜索IdentityServer4并安装
等待安装完成后,下载官方提供的UI文件,并拖放到项目中。(注意只需要复制文件夹就行)
修改启动端口为5000,启动访问:http://localhost:5000/,效果如下
二、配置ProjectAPI
新建ASP.NET CORE API项目,使用NuGet添加包:IdentityServer4.AccessTokenValidation、Swashbuckle.AspNetCore
在API中添加 AuthorizeCheckOperationFilter用于管理IdentityServer4认证处理,代码如下:
public class AuthorizeCheckOperationFilter: IOperationFilter { public void Apply(OpenApiOperation operation, OperationFilterContext context) { //获取是否添加登录特性 //策略名称映射到范围 var requiredScopes = context.MethodInfo .GetCustomAttributes(true) .OfType<AuthorizeAttribute>() .Select(attr => attr.Policy) .Distinct(); if (requiredScopes.Any()) { operation.Responses.Add("401", new OpenApiResponse { Description = "未经授权" }); operation.Responses.Add("403", new OpenApiResponse { Description = "禁止访问" }); var oAuthScheme = new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "oauth2" } }; operation.Security = new List<OpenApiSecurityRequirement> { new OpenApiSecurityRequirement { [ oAuthScheme ] = requiredScopes.ToList() } }; } } }
修改API的Startup文件,修改如下:
public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); //用户校验 services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme) .AddIdentityServerAuthentication(options => { options.Authority = "http://localhost:5000"; // IdentityServer服务器地址 options.ApiName = "demo_api"; // 用于针对进行身份验证的API资源的名称 options.RequireHttpsMetadata = false; // 指定是否为HTTPS }); //添加Swagger. services.AddSwaggerGen(options => { options.SwaggerDoc("v1", new OpenApiInfo { Title = "Project API", Version = "v1" }); //向生成的Swagger添加一个或多个“securityDefinitions”,用于API的登录校验 options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme { Type = SecuritySchemeType.OAuth2, Flows = new OpenApiOAuthFlows { Implicit = new OpenApiOAuthFlow { //授权地址 AuthorizationUrl = new Uri("http://localhost:5000/connect/authorize"), Scopes = new Dictionary<string, string> { { "ProjectApiScope", "请选择授权API" }, } } } }); options.OperationFilter<AuthorizeCheckOperationFilter>(); // 添加IdentityServer4认证过滤 }); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); // Swagger JSON Doc app.UseSwagger(); // Swagger UI app.UseSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); options.OAuthClientId("projectClient");//客服端名称 options.OAuthAppName("Demo API - Swagger-演示"); // 描述 }); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
这里要注意api中的ClientId和identityserver中的ClientId要是一样的,Scopes也要一样
控制器中的api注意加上验证
修改Properties文件夹下的launchSettings启动端口为5001,并且修改launchUrl为swagger即可一运行就访问swagger页面
访问呈现效果如下,从中效果图中可以看出添加登录按钮,API控制器中如果添加Authorize特性,对应接口会有一把锁的标志:
如果未授权访问接口返回401,未授权提示:
点击Authorize按钮会跳转到IdentityServer4登录页面,登录授权成功后会自动获取登录后服务器返回Token,再次访问接口即可正常访问,授权前后效果如下:
授权会自动跳转到identityserver4授权页面
参考文献:https://www.cnblogs.com/miskis/p/10083985.html
源码地址:https://github.com/Aooys/ASP.NET-CORE3.0-API-Swagger-IdentityServer4