Identity Server踩坑记录

前言

最近花时间研究了一下Identity Server的使用。简单来说Identity Server是一个能够为Asp .Net Core web程序添加身份认证、授权、oauth等功能的中间件。配置好之后,能够方便的对用户权限进行管理,并且能大幅度增加应用程序的安全性。
微软的统一身份认证平台很有可能就是基于identity server的。

需要注意的问题

首先,如果想使用identity server提供openid connect服务,就一定要注意identity server设置中的schemescheme是asp中的重要概念,要想在asp中配置一个好的身份验证系统必须熟悉scheme
配置idserver的scheme时要注意几个要点:

  • idserver本身的api是否使用idserver中间件进行保护

    • 是:idserver的scheme与原本的cookie scheme应该相同

    • 否:idserver的scheme与原本的cookie scheme应该不一样,且需要注意:默认的authorize scheme应该是原本的cookie scheme。

      services.AddAuthentication(op =>
      {
          op.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;//默认的scheme
          op.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
          op.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
      })
      
  • idserver在生产环境是否需要使用反代

    • 不使用:不需要修改代码

    • 使用:获取token会出错,需要修改代码。分为两种改法:正规改法和hacky改法

      • 正规方法:在反代服务器中添加几个header,这里以nginx配置为例:

      
      location / {
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;	
      }
      

      然后在asp中添加forward header中间件

      public void ConfigureServices(IServiceCollection services)
      {
          //...
          services.Configure<ForwardedHeadersOptions>(options =>
          {
              options.ForwardedHeaders =
                  ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost;
              options.KnownNetworks.Clear();
              options.KnownProxies.Clear();
          });
          //...
      }
      public void Configure(IApplicationBuilder app)
      {
          //...
          app.UseForwardedHeaders();
          //...
      }
      

      这样设置之后,asp就能够获取你的反代服务器的schema,而不是基于自己的schema

      • hacky改法:若反代是https而内部服务器是http,则加入一下中间件:

      app.Use(async (ctx, next) =>
      {
          ctx.SetIdentityServerOrigin($"https://yourdomain.xxx");
          await next();
      });
      

[!TIP] 为什么反代会导致idserver的功能出现问题?
反代的时候,往往证书配置在反代服务器上,而内部真正的服务器用http协议和反代服务器交流,也就是说反代服务器是https,真正的后端服务器是http。
而idserver的token api出于安全考虑,要求使用https。但是反代之后后端接收的请求是http的,这会导致idserver拒绝进行授权。
在我们加了headerforward中间件之后,asp将会从这个header中自动读取真实的schema,从而解决这个问题。


本文章使用limfx的vsocde插件快速发布