You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 08:50:35