如何在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
相关产品推荐
相关产品推荐

