最近花时间研究了一下Identity Server的使用。简单来说Identity Server是一个能够为Asp .Net Core web程序添加身份认证、授权、oauth等功能的中间件。配置好之后,能够方便的对用户权限进行管理,并且能大幅度增加应用程序的安全性。
微软的统一身份认证平台很有可能就是基于identity server的。
首先,如果想使用identity server提供openid connect服务,就一定要注意identity server设置中的scheme。scheme是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插件快速发布