(3)- IdentityServer 4 保护WebApi接口数据资源(.Net Core 3.1)

本文前提说明

  • 本文在文章:(2)- IdentityServer 4 授权端 - (动态)账户密码模式搭建(.net core 3.1)的基础上构建

给SystemApi和OpenApi项目添加IdentityServer验证

在2个项目下都增加控制器(ApiController)

  • 编辑内容如下
public IActionResult Get()
{
    // return new JsonResult(from c in User.Claims select new { c.Type, c.Value });

    dynamic x = new System.Dynamic.ExpandoObject();
    x.name = "open api";
    return new JsonResult(x);
}
  • 运行效果
SystemApi - 端口8045 - 运行效果
OpenApi - 端口8046 - 运行效果

给2个项目增加IdentityServer授权验证

  1. 在StartUp.cs做如下修改
  • 注意Authority如果为127.0.0.1的ip地址,就不能用192.168.1.xx获取的Token进行访问,否则会报then issuer xxx is invalid,反之也一样
StartUp - 修改内容
  1. 代码展示OpenApi(SystemApi同样配置)
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace OpenApi
{
    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            // 让返回的数据原样输出
            services.AddMvc().AddJsonOptions(options =>
            {
                // 忽略null数据
                options.JsonSerializerOptions.IgnoreNullValues = true;
                // 不设定 = 原样输出
                options.JsonSerializerOptions.PropertyNamingPolicy = null;
            });

            // 为Api资源添加IdentityServer授权验证         
            services.AddAuthentication("Bearer").AddJwtBearer("Bearer", options =>
            {
                // IdentityServer授权站点路径
                options.Authority = "http://127.0.0.1:8044";
                // 是否需要HTTPS
                options.RequireHttpsMetadata = false;
                // 客户端名称,与IdentityServer授权端配置的api资源及客户端Scope名称一致
                options.Audience = "L.Id4Auth.Api";
            });
        }

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

            // 使用 认证
            app.UseAuthentication();
            // 使用 授权
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();

                //endpoints.MapGet("/", async context =>
                //{
                //    await context.Response.WriteAsync("Hello World!");
                //});
            });
        }
    }
}

在ApiController中增加标签:[Authorize]

  • 在最外层类上方添加表明整个控制器都需要验证,在方法名上面添加代表该方法需要验证
增加标签效果图

编译运行项目

  • 出现 401错误:代表当前请求需要用户验证
401错误 - 需要用户验证

使用Postman并使用Token进行访问api接口

  • 未使用Token访问:http://127.0.0.1:8046/api
未使用Token访问
  • 使用同一个Token访问:http://127.0.0.1:8045/api 和 http://127.0.0.1:8046/api
  1. 获取Token
  • Ip地址与端口号要与您的Api项目(SystemApi和OpenApi)设定的Authority值一致
  • 使用127.0.0.1获取的Token不可以在本地ip地址上使用,会出现(Bearer error="invalid_token", error_description=)等错误
获取Token
  1. 使用Token访问Api数据
  • 在Header中填写内容如下,Bearer后面有空格
Authorization
Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjlYWXUxdlFseWl1RlVOd2tNeFpYVXciLCJ0eXAiOiJhdCtqd3QifQ
  • 访问8045端口站点
8045端口站点
  • 访问8046端口站点
8045端口站点

总结

  • 使用数据库的账户密码,来获取Token
  • 并使用同一Token访问不同的Api站点数据(结合到项目也就是单点登录)

你可能感兴趣的:((3)- IdentityServer 4 保护WebApi接口数据资源(.Net Core 3.1))