ASP.NET Core3.1 Ocelot认证的实现
副问题[/!--empirenews.page--]
当客户端通过Ocelot会见下流处事的时辰,为了掩护下流资源处事器会举办认证鉴权,这时辰必要在Ocelot添加认证处事。添加认证处过后,随后Ocelot会基于授权密钥授权每个哀求可以会见的资源。用户必需像往常一样在其Startup.cs中注册身份验证处事,可是他们为每次注册提供一个方案(身份验证提供者密钥),譬喻: public void ConfigureServices(IServiceCollection services) { var authenticationProviderKey = "TestKey"; services.AddAuthentication() .AddJwtBearer(authenticationProviderKey, x => { }); } 在此Ocelot认证项目示例中,TestKey是已注册此提供措施的方案,然后将其映射到网关项目Routes路由中: { "Routes": [ { "DownstreamPathTemplate": "/api/customers", "DownstreamScheme": "http", "DownstreamHost": "localhost", "DownstreamPort": 9001, "UpstreamPathTemplate": "/customers", "UpstreamHttpMethod": [ "Get" ], "AuthenticationOptions": { "AuthenticationProviderKey": "TestKey", "AllowedScopes": [] } } ] } Ocelot运行时,它将查察Routes.AuthenticationOptions.AuthenticationProviderKey并搜查是否存在行使给定密钥注册的身份验证提供措施。假如不存在,则Ocelot将不会启动,假如存在,则Routes将在执行时行使该提供措施。假如对路由举办身份验证,Ocelot将在执行身份验证中间件时挪用与之关联的任何方案。假如哀求通过身份验证失败,Ocelot将返回http状态代码401。 2.JWT Tokens Bearer认证 Json Web Token (JWT),是为了在收集应用情形间转达声明而执行的一种基于JSON的开放尺度(RFC 7519)。该token被计划为紧凑且安详的,出格合用于漫衍式站点的单点登录(SSO)场景。JWT的声明一样平常被用来在身份提供者和处事提供者间转达被认证的用户身份信息,以便于从资源处事器获取资源,也可以增进一些特另外其余营业逻辑所必需的声明信息,该token也可直接被用于认证,也可被加密。 2.1JWT令牌布局 在紧凑的情势中,JSON Web Tokens由dot(.)脱离的三个部门构成,它们是:Header头、Payload有用载荷、Signature署名。因此,JWT凡是如下所示:xxxxx.yyyyy.zzzzz(Header.Payload.Signature)。 2.1.1Header头 标头凡是由两部门构成:令牌的范例,即JWT,以及正在行使的署名算法,譬喻HMAC SHA256或RSA。譬喻: { "alg": "HS256", "typ": "JWT" } 然后,这个JSON被编码为Base64Url,形成JWT的第一部门。 2.1.2Payload有用载荷 Payload部门也是一个JSON工具,用来存放现实必要转达的数据。JWT划定了7个官方字段,供选用。 iss (issuer):签发人 exp (expiration time):逾期时刻 sub (subject):主题 aud (audience):受众 nbf (Not Before):见效时刻 iat (Issued At):签发时刻 jti (JWT ID):编号 除了官方字段,你还可以在这个部门界说私有字段,下面就是一个例子。譬喻: { "sub": "1234567890", "name": "John Doe", "admin": true } 留意,JWT默认是不加密的,任何人都可以读到,以是不要把奥秘信息放在这个部门。这个JSON工具也要行使Base64URL算法转成字符串。 2.1.3.Signature署名 Signature部门是前两部门的署名,防备数据改动。起首,必要指定一个密钥(secret)。这个密钥只有处事器才知道,不能泄漏给用户。然后,行使Header内里指定的署名算法(默认是HMAC SHA256),凭证下面的公式发生署名: HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) 署名用于验证动静在此进程中未被变动,而且,在行使私钥署名的令牌的环境下,它还可以验证JWT的发件人是否是它所声称的人。把他们三个所有放在一路,输出是三个由点脱离的Base64-URL字符串,可以在HTML和HTTP情形中轻松转达,而与基于XML的尺度(如SAML)对比越发紧凑。下面表现了一个JWT,它具有先前的头和有用负载编码,并行使机要署名: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 .eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoid3prNzAzIiwibmJmIjoiMTU5MjE0MzkzNyIsImV4cCI6MTU5MjE0Mzk5OCwiaXNzIjoiYXV0aC5qd3QuY2MiLCJhdWQiOiJkZW5nd3V8MjAyMC82LzE0IDIyOjEyOjE5In0 .4RiwhRy0rQkZjclOFWyTpmW7v0AMaL3aeve1L-eWIz0 着实一样平常发送用户名和暗码获取token那是由Identity4来完成的,包罗验证用户,天生JwtToken。可是项目这里是由System.IdentityModel.Tokens类库来天生JwtToken。最后返回jwt令牌token给用户。JwtToken解码可以通过https://jwt.io/中举办查察。 3.项目演示 3.1APIGateway项目 在该项目中启用身份认证来掩护下流api处事,行使JwtBearer认证,将默认的身份验证方案配置为TestKey。在appsettings.json文件中设置认证中密钥(Secret)跟受众(Aud)信息: { "Audience": { "Secret": "Y2F0Y2hlciUyMHdvbmclMjBsb3ZlJTIwLm5ldA==", "Iss": "http://www.c-sharpcorner.com/members/catcher-wong", "Aud": "Catcher Wong" } } Startup添加身份认证代码如下: public void ConfigureServices(IServiceCollection services) { //获取appsettings.json文件中设置认证中密钥(Secret)跟受众(Aud)信息 var audienceConfig = Configuration.GetSection("Audience"); //获取安详秘钥 var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(audienceConfig["Secret"])); //token要验证的参数荟萃 var tokenValidationParameters = new TokenValidationParameters { //必需验证安详秘钥 ValidateIssuerSigningKey = true, //赋值安详秘钥 IssuerSigningKey = signingKey, //必需验证签发人 ValidateIssuer = true, //赋值签发人 ValidIssuer = audienceConfig["Iss"], //必需验证受众 ValidateAudience = true, //赋值受众 ValidAudience = audienceConfig["Aud"], //是否验证Token有用期,行使当前时刻与Token的Claims中的NotBefore和Expires比拟 ValidateLifetime = true, //应承的处事器时刻偏移量 ClockSkew = TimeSpan.Zero, //是否要求Token的Claims中必需包括Expires RequireExpirationTime = true, }; //添加处事验证,方案为TestKey services.AddAuthentication(o => { o.DefaultAuthenticateScheme = "TestKey"; }) .AddJwtBearer("TestKey", x => { x.RequireHttpsMetadata = false; //在JwtBearerOptions设置中,IssuerSigningKey(署名秘钥)、ValidIssuer(Token揭晓机构)、ValidAudience(揭晓给谁)三个参数是必需的。 x.TokenValidationParameters = tokenValidationParameters; }); //添加Ocelot网关处事时,包罗Secret秘钥、Iss签发人、Aud受众 services.AddOcelot(Configuration); } public async void Configure(IApplicationBuilder app, IHostingEnvironment env) { //行使认证处事 app.UseAuthentication(); //行使Ocelot中间件 await app.UseOcelot(); } 3.1.1Identity Server承载JWT Token (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |