5.42自定义 HTTP 声明提取器(授权)
创建于 2026 年 8 月 17 日约 1 分钟读完
以下是一个示例,展示了如何通过自定义 AuthenticationAttribute 和 AllowAnonymousAttribute 特性,并添加相应的提取器,以实现自动授权和匿名访问功能。
1. 定义 AuthenticationAttribute 特性
将 AuthenticationAttribute 特性应用于方法或接口上。
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Interface)]public class AuthenticationAttribute : Attribute;2. 实现 AuthenticationDeclarativeExtractor 和 AllowAnonymousDeclarativeExtractor 提取器
/// <summary>/// [Authentication] 特性提取器/// </summary>public class AuthenticationDeclarativeExtractor : IHttpDeclarativeExtractor{ /// <inheritdoc /> public void Extract(HttpRequestBuilder httpRequestBuilder, HttpDeclarativeParsingContext context) { // 如果贴了 [AllowAnonymous] 特性则跳过 if (context.IsMethodDefined<AllowAnonymousAttribute>(out _, true)) return; // 检查是否已经设置了授权信息 if (httpRequestBuilder.AuthenticationHeader is not null) return; // 添加授权标头(这里可以实现任何授权的逻辑,比如从参数获取 token 等等) httpRequestBuilder.AddBearerAuthentication( "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"); }}/// <summary>/// [AllowAnonymous] 特性提取器/// </summary>public class AllowAnonymousDeclarativeExtractor : IHttpDeclarativeExtractor{ /// <inheritdoc /> public void Extract(HttpRequestBuilder httpRequestBuilder, HttpDeclarativeParsingContext context) { // 如果没有贴 [AllowAnonymous] 特性则跳过 if (!context.IsMethodDefined<AllowAnonymousAttribute>(out _, true)) return; // 移除授权标头 httpRequestBuilder.RemoveHeaders("Authorization"); }}3. 在配置中注册自定义提取器
在 Startup.cs 或 Program.cs 文件中,配置并注册 HttpRemote 服务,以启用自定义 HTTP 声明式提取器功能。
services.AddHttpRemote(builder =>{ // 添加自定义 HTTP 声明式提取器 builder.AddHttpDeclarativeExtractors(() => [ new AuthenticationDeclarativeExtractor(), new AllowAnonymousDeclarativeExtractor() ]); // 扫描程序集批量添加 HTTP 声明式提取器(推荐) // builder.AddHttpDeclarativeExtractorsFromAssemblies([ assembly1, assembly2, ... ]); // 若使用 Furion 框架可直接设置 App.Assemblies});4. 在 HTTP 声明式接口中使用自定义特性
[Authentication] // 添加全局授权public interface IAuthService : IHttpDeclarative{ [Get("https://furion.net/")] Task<string> GetDataAsync(); // 访问这个接口需要授权 [AllowAnonymous] // 匿名访问 [Get("https://furion.net/")] Task<string> LoginAsync(string username, string password);}当调用 GetDataAsync 方法时,将自动添加授权标头(实现授权)。调用 LoginAsync 方法时,将自动移除授权请求标头(实现匿名访问)。
通过这个示例可以看出,自定义 HTTP 声明提取器为实现复杂的授权逻辑提供了极大的灵活性。