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

如何将.NET Framework 4.8.1的OAuthAuthorizationServerOptions迁移至.NET 8 API

.NET Framework 4.8.1 OAuth2授权代码迁移至.NET 8 解决方案

.NET Framework 4.8.1中使用的OAuthAuthorizationServerMiddleware是OWIN生态组件,ASP.NET Core(包括.NET 8)没有直接内置等效功能,以下是两种可行的迁移方案,优先推荐第一种(与原有代码结构最接近):

方案一:使用AspNet.Security.OAuth.Servers库(最接近原有实现)

该库是OWIN OAuth授权服务器的ASP.NET Core移植版,能最小化代码改动完成迁移。

1. 安装NuGet包

Install-Package AspNet.Security.OAuth.Servers

2. 替换原有配置代码

在Program.cs中配置认证服务与中间件,对应原有OAuthAuthorizationServerOptions和SimpleAuthorizationServerProvider的逻辑:

using AspNet.Security.OAuth.Validation;
using AspNet.Security.OAuth.Servers;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

var builder = WebApplication.CreateBuilder(args);

// 添加认证服务
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = OAuthValidationDefaults.AuthenticationScheme;
})
// 配置令牌验证中间件
.AddOAuthValidation(options =>
{
    options.Events = new OAuthValidationEvents
    {
        // 可选:自定义令牌验证逻辑(若原有Provider中有额外验证逻辑可迁移至此)
        OnValidateToken = context =>
        {
            // 示例:验证令牌中的自定义声明
            var userName = context.Principal?.FindFirstValue(ClaimTypes.Name);
            if (string.IsNullOrEmpty(userName))
            {
                context.Reject("Invalid token: missing username claim");
            }
            return Task.CompletedTask;
        }
    };
})
// 配置OAuth授权服务器(对应原有OAuthAuthorizationServerOptions)
.AddOAuthServer(options =>
{
    // 开发环境允许HTTP,生产环境必须改为false并启用HTTPS
    options.AllowInsecureHttp = true;
    // 令牌端点路径与原有一致
    options.TokenEndpointPath = "/token";
    // 令牌过期时间与原有一致
    options.AccessTokenLifetime = TimeSpan.FromDays(1);

    // 配置签名密钥(生产环境请使用安全的密钥存储方式,如机密管理器、密钥 vault)
    var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("your-strong-secret-key-at-least-32-characters"));
    options.SigningCredentials.Add(new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256));

    // 对应原有SimpleAuthorizationServerProvider的逻辑
    options.Events = new OAuthServerEvents
    {
        // 验证客户端身份(对应原有ValidateClientAuthentication方法)
        OnValidateClientAuthentication = context =>
        {
            // 从请求表单中获取客户端凭证(可根据原有逻辑调整,比如从Header获取)
            if (!context.Request.Form.TryGetValue("client_id", out var clientId) ||
                !context.Request.Form.TryGetValue("client_secret", out var clientSecret))
            {
                context.Reject("Missing client credentials");
                return Task.CompletedTask;
            }

            // 替换为你的客户端验证逻辑(比如查询数据库校验client_id和client_secret)
            if (clientId == "valid-client-id" && clientSecret == "valid-client-secret")
            {
                // 验证通过
                context.Validated(clientId);
            }
            else
            {
                context.Reject("Invalid client credentials");
            }

            return Task.CompletedTask;
        },
        // 处理资源所有者密码凭证授权(对应原有GrantResourceOwnerCredentials方法)
        OnGrantResourceOwnerCredentials = context =>
        {
            // 替换为你的用户身份验证逻辑(比如查询数据库校验用户名密码)
            if (context.UserName == "valid-user" && context.Password == "valid-password")
            {
                // 创建用户身份声明
                var claims = new List<Claim>
                {
                    new Claim(ClaimTypes.Name, context.UserName),
                    new Claim(ClaimTypes.Role, "Admin")
                    // 添加其他需要的声明
                };

                var identity = new ClaimsIdentity(context.Scheme.Name);
                identity.AddClaims(claims);

                // 验证通过,颁发令牌
                context.Validated(identity);
            }
            else
            {
                context.Reject("Invalid username or password");
            }

            return Task.CompletedTask;
        }
    };
});

// 添加授权服务
builder.Services.AddAuthorization();

var app = builder.Build();

// 启用认证与授权中间件(顺序不能错)
app.UseAuthentication();
app.UseAuthorization();

// 其他中间件配置...

app.Run();

方案二:使用Duende IdentityServer(官方推荐的企业级方案)

如果需要更完整的OAuth2/OpenID Connect功能(如授权码流、刷新令牌、客户端管理等),可使用Duende IdentityServer(原IdentityServer4的商业版,社区版免费用于非商业项目)。

核心步骤:

  1. 安装NuGet包:Install-Package Duende.IdentityServer
  2. 配置IdentityServer服务,定义客户端、身份资源、API资源
  3. 实现用户验证逻辑(可集成ASP.NET Core Identity)
  4. 启用IdentityServer中间件

该方案更适合复杂场景,但代码改动量较大,需根据业务需求选择。

关键注意事项

  • 生产环境必须禁用AllowInsecureHttp,强制使用HTTPS
  • 签名密钥需使用足够强度的随机字符串,且不能硬编码在代码中,建议使用.NET机密管理器或云服务密钥存储
  • 原有SimpleAuthorizationServerProvider中的自定义逻辑需对应迁移至新方案的事件回调中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:20:06