配置IdentityServer4让Grpc服务同时支持Cookie与Bearer令牌授权
解决方案
要让你的IdentityCenter应用同时支持Cookie和Bearer令牌授权Grpc服务,需要在ASP.NET Core的认证与授权系统中添加Bearer认证支持,并配置授权策略允许两种认证方式。以下是具体配置步骤:
1. 添加Bearer认证服务
在Program.cs中,添加完IdentityServer的配置后,新增JWT Bearer认证配置,用于验证Bearer令牌:
builder.Services.AddAuthentication() .AddJwtBearer(options => { // 指向你的IdentityServer4应用地址 options.Authority = "https://your-identitycenter-domain"; // 对应IS4中已注册的API资源名称 options.Audience = "your-api-resource-name"; // 令牌验证参数配置 options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true }; // 适配Grpc的授权头读取逻辑 options.Events = new JwtBearerEvents { OnMessageReceived = context => { var authHeader = context.Request.Headers.Authorization.ToString(); if (!string.IsNullOrWhiteSpace(authHeader)) { context.Token = authHeader.Replace("Bearer ", ""); } return Task.CompletedTask; } }; });
2. 配置授权策略,允许双认证方案
配置授权系统,让默认策略同时接受Cookie(IdentityServer默认认证方案)和Bearer两种认证方式:
using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authentication.JwtBearer; // ... builder.Services.AddAuthorization(options => { options.DefaultPolicy = new AuthorizationPolicyBuilder() .AddAuthenticationSchemes( CookieAuthenticationDefaults.AuthenticationScheme, JwtBearerDefaults.AuthenticationScheme) .RequireAuthenticatedUser() .Build(); });
如果只想让Grpc服务单独使用双认证策略,可以自定义策略并指定给Grpc端点:
// 自定义双认证策略 builder.Services.AddAuthorization(options => { options.AddPolicy("CookieOrBearer", policy => { policy.AddAuthenticationSchemes( CookieAuthenticationDefaults.AuthenticationScheme, JwtBearerDefaults.AuthenticationScheme) .RequireAuthenticatedUser(); }); }); // 映射Grpc服务时绑定自定义策略 app.MapGrpcService<UserInfoService>().RequireAuthorization("CookieOrBearer");
3. 确认IS4端配置正确性
- 确保IS4的配置数据库中已创建API资源,其名称与上述
options.Audience的值完全一致。 - 确认调用Grpc的客户端应用,在IS4的客户端配置中已被授权访问该API资源(
AllowedScopes包含对应API的scope)。 - 验证请求中的Bearer令牌由你的IS4颁发,且包含正确的
aud(受众)和scope(权限范围)。
4. 调整Grpc服务授权特性
如果使用自定义策略,需要在Grpc服务类上指定策略名称:
// 使用全局默认策略则保留原特性 // [Authorize] // 使用自定义策略则指定策略名 [Authorize(Policy = "CookieOrBearer")] internal class UserInfoService : UserInfo.UserInfoBase { // ... 现有代码 }
完成以上配置后,你的Grpc服务即可同时支持Cookie和Bearer令牌两种授权方式。
内容的提问来源于stack exchange,提问作者Stiven Diplet
相关产品推荐
相关产品推荐

