• 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

  • 相关阅读:
    javascript/jquery操作cookie
    更改IE/FireFox查看源代码的默认编辑器,比如notepad++
    javascript refresh page 几种页面刷新的方法
    C# Enum,Int,String的互相转换 枚举转换
    js中两个感叹号的作用
    JQuery操作iframe
    JQuery判断一个元素下面是否有内容或者有某个标签
    Meta标签详解
    五一放假回校,真爽
    ASP.NET错误处理(一)摘自MSDN
  • 原文地址:https://www.cnblogs.com/liguix/p/13056560.html
Copyright © 2020-2023  润新知