5.42自定义 HTTP 声明提取器(授权)

创建于 2026 年 8 月 17 日约 1 分钟读完

以下是一个示例,展示了如何通过自定义 AuthenticationAttributeAllowAnonymousAttribute 特性,并添加相应的提取器,以实现自动授权和匿名访问功能。

1. 定义 AuthenticationAttribute 特性

AuthenticationAttribute 特性应用于方法或接口上。

cs
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Interface)]public class AuthenticationAttribute : Attribute;

2. 实现 AuthenticationDeclarativeExtractorAllowAnonymousDeclarativeExtractor 提取器

cs
/// <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.csProgram.cs 文件中,配置并注册 HttpRemote 服务,以启用自定义 HTTP 声明式提取器功能。

cs
services.AddHttpRemote(builder =>{    // 添加自定义 HTTP 声明式提取器    builder.AddHttpDeclarativeExtractors(() => [ new AuthenticationDeclarativeExtractor(), new AllowAnonymousDeclarativeExtractor() ]);    // 扫描程序集批量添加 HTTP 声明式提取器(推荐)    // builder.AddHttpDeclarativeExtractorsFromAssemblies([ assembly1, assembly2, ... ]); // 若使用 Furion 框架可直接设置 App.Assemblies});

4. 在 HTTP 声明式接口中使用自定义特性

cs
[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 声明提取器为实现复杂的授权逻辑提供了极大的灵活性。