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

如何在Openiddict中结合使用客户端凭据流与带win-auth的授权码流

OpenIddict同时支持客户端凭据流与授权码流的实现方案

1. 基础服务配置

在承载OpenIddict的MyApi项目的服务注册逻辑中,同时开启两种流的支持,示例代码:

builder.Services.AddOpenIddict()
    .AddServer(options =>
    {
        // 开启授权端点(供授权码流使用)、token端点(两种流都需要)
        options.SetAuthorizationEndpointUris("connect/authorize")
               .SetTokenEndpointUris("connect/token");
        
        // 同时允许两种流
        options.AllowAuthorizationCodeFlow()
               .AllowClientCredentialsFlow();
        
        // 保留你原有的win-auth集成、加密签名配置、开发证书配置等逻辑
        options.UseAspNetCore()
               .EnableAuthorizationEndpointPassthrough()
               .EnableTokenEndpointPassthrough()
               .DisableTransportSecurityRequirement(); // 开发环境用,生产环境移除
    })
    .AddValidation(options =>
    {
        options.UseLocalServer();
        options.UseAspNetCore();
    });

2. 客户端注册配置

在OpenIddict的客户端存储逻辑中,给需要支持多流的客户端配置允许的授权类型,示例配置:

await manager.CreateAsync(new OpenIddictApplicationDescriptor
{
    ClientId = "MyClientApp1",
    ClientSecret = "your_client_secret",
    // 同时添加两种授权类型
    GrantTypes =
    {
        GrantTypes.ClientCredentials,
        GrantTypes.AuthorizationCode
    },
    // 授权码流需要的重定向地址,按你的实际情况配置
    RedirectUris = { "https://myclientapp1/callback" },
    // 配置允许的权限范围,按需添加
    Scopes =
    {
        Scopes.OpenId,
        Scopes.Profile,
        "myapi.access"
    }
});

3. 自定义授权策略适配双流校验

基于ASP.NET Core的授权系统,分别定义两类权限策略,匹配你不同的接口访问要求:

builder.Services.AddAuthorization(options =>
{
    // 纯客户端校验策略:仅要求请求来自指定客户端,不需要用户登录
    options.AddPolicy("OnlyMyClientApp1", policy =>
    {
        policy.RequireAuthenticatedUser();
        policy.RequireClaim("client_id", "MyClientApp1");
    });
    
    // 客户端+用户校验策略:同时要求指定客户端和指定用户
    options.AddPolicy("MyClientApp1AndMyUser1", policy =>
    {
        policy.RequireAuthenticatedUser();
        policy.RequireClaim("client_id", "MyClientApp1");
        // 这里的name声明对应win-auth的用户名,按你实际的用户标识声明调整
        policy.RequireClaim(ClaimTypes.Name, "MyUser1");
    });
    
    // 其余接口的策略按上面的逻辑依次定义即可
});

4. 接口绑定权限策略

给对应的接口端点添加对应的策略标注即可:

[ApiController]
[Route("api/[controller]")]
public class TestController : ControllerBase
{
    [HttpGet("only-client1")]
    [Authorize(Policy = "OnlyMyClientApp1")]
    public IActionResult OnlyForMyClientApp1()
    {
        return Ok();
    }
    
    [HttpGet("client1-user1")]
    [Authorize(Policy = "MyClientApp1AndMyUser1")]
    public IActionResult OnlyForMyClientApp1AndMyUser1()
    {
        return Ok();
    }
}

注意事项

  • 客户端凭据流返回的访问令牌默认不包含用户相关声明,校验时不会触发用户身份的检查,刚好匹配你纯客户端接口的需求
  • 授权码流返回的访问令牌同时携带client_id和用户身份声明,可同时满足两类校验要求
  • 你原有的win-auth集成逻辑不需要改动,授权码流的用户身份认证逻辑保持和你之前的实现一致即可

内容的提问来源于stack exchange,提问作者MiHo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:15:03