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

.NET Framework迁移至.NET 6:OWIN认证授权代码迁移(令牌认证)

.NET6中OWIN授权的替代方案

.NET Core(包括.NET6)不再支持原.NET Framework中的Microsoft.Owin系列组件,这是因为ASP.NET Core重构了底层HTTP管道与认证授权体系,完全脱离了OWIN依赖。以下是具体的迁移替代方案:

1. 替换OWIN认证中间件

使用ASP.NET Core内置的认证授权中间件体系,以常见的JWT认证为例,配置步骤如下:

var builder = WebApplication.CreateBuilder(args);

// 注册JWT认证服务
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = builder.Configuration["Jwt:Issuer"],
            ValidAudience = builder.Configuration["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
        };
    });

// 注册授权服务
builder.Services.AddAuthorization();

var app = builder.Build();

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

app.MapControllers();

app.Run();

2. 替换AuthenticationTokenProvider

原Microsoft.Owin.Security.Infrastructure.AuthenticationTokenProvider用于自定义令牌生成/验证逻辑,在ASP.NET Core中可通过以下方式替代:

自定义令牌生成逻辑

直接使用JwtSecurityTokenHandler生成JWT令牌:

using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;

public class TokenService
{
    private readonly IConfiguration _configuration;

    public TokenService(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public string GenerateJwtToken(string userId, string username)
    {
        var claims = new[]
        {
            new Claim(JwtRegisteredClaimNames.Sub, userId),
            new Claim(ClaimTypes.Name, username)
        };

        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
        var signingCreds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

        var token = new JwtSecurityToken(
            issuer: _configuration["Jwt:Issuer"],
            audience: _configuration["Jwt:Audience"],
            claims: claims,
            expires: DateTime.UtcNow.AddMinutes(30),
            signingCredentials: signingCreds);

        return new JwtSecurityTokenHandler().WriteToken(token);
    }
}

自定义令牌验证逻辑

若需自定义令牌验证,可通过JwtBearerOptions.Events扩展:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        // 其他配置...
        options.Events = new JwtBearerEvents
        {
            OnTokenValidated = context =>
            {
                // 自定义令牌验证逻辑,比如检查用户状态
                var userId = context.Principal?.FindFirstValue(ClaimTypes.NameIdentifier);
                if (string.IsNullOrEmpty(userId))
                {
                    context.Fail("Invalid token");
                }
                return Task.CompletedTask;
            }
        };
    });

3. 迁移自定义OWIN中间件

原OwinMiddleware可转换为ASP.NET Core自定义中间件,示例如下:

public class CustomAuthMiddleware
{
    private readonly RequestDelegate _next;

    public CustomAuthMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // 原OWIN中间件逻辑,适配ASP.NET Core的HttpContext即可
        // 示例:检查请求头中的自定义令牌
        var token = context.Request.Headers["X-Custom-Token"].FirstOrDefault();
        if (!string.IsNullOrEmpty(token))
        {
            // 自定义验证逻辑...
        }

        await _next(context);
    }
}

// 在Program.cs中注册中间件
app.UseMiddleware<CustomAuthMiddleware>();

关键适配点

  • 原IOwinContext对应ASP.NET Core的HttpContext,所有请求上下文信息均可通过HttpContext获取。
  • 第三方认证(如OAuth2、OpenID Connect)可直接使用ASP.NET Core内置的AddOAuth、AddOpenIdConnect扩展方法,替代原OWIN的对应组件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:21:10