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

将ASP.NET 4.8认证/授权功能迁移至ASP.NET Core 6的示例问询

ASP.NET Core 6 迁移实现示例

1. 配置文件(appsettings.json)

替换原Web.config的appSettings,配置Azure AD相关参数:

{
  "AzureAd": {
    "ClientId": "SomeGuidValue",
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "SomeGuidValue",
    "PostLogoutRedirectUri": "https://localhost:SomePortNumber/"
  }
}

2. Program.cs 配置认证中间件

ASP.NET Core 6 使用顶级语句,在Program.cs中配置认证服务和中间件:

using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.IdentityModel.Tokens;
using System.Globalization;

var builder = WebApplication.CreateBuilder(args);

// 添加控制器和视图服务
builder.Services.AddControllersWithViews();

// 配置认证服务
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
    options.Cookie.Name = "Cookies";
    // Core 中默认的 CookieManager 已处理分块逻辑,无需额外配置
})
.AddOpenIdConnect(options =>
{
    var azureAdConfig = builder.Configuration.GetSection("AzureAd");
    options.ClientId = azureAdConfig["ClientId"];
    options.Authority = string.Format(CultureInfo.InvariantCulture, "{0}{1}", 
        azureAdConfig["Instance"], azureAdConfig["TenantId"]);
    options.PostLogoutRedirectUri = azureAdConfig["PostLogoutRedirectUri"];
    
    options.TokenValidationParameters = new TokenValidationParameters
    {
        NameClaimType = System.Security.Claims.ClaimTypes.Name,
        RoleClaimType = System.Security.Claims.ClaimTypes.Role
    };
    
    // 处理认证失败事件
    options.Events = new OpenIdConnectEvents
    {
        OnAuthenticationFailed = context =>
        {
            context.HandleResponse();
            context.Response.Redirect("/");
            return Task.CompletedTask;
        }
    };
});

var app = builder.Build();

// 配置请求管道
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

// 启用认证和授权中间件
app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

3. 自定义授权属性(CustomAuthorizeAttribute.cs)

ASP.NET Core 中自定义授权属性需继承AuthorizeAttribute并实现IAuthorizationFilter,同时通过依赖注入获取DbContext:

using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;

public class CustomAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    private readonly string[] _roles;

    public CustomAuthorizeAttribute(params string[] roles)
    {
        _roles = roles;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        if (!Authorize(context.HttpContext))
        {
            context.Result = new Microsoft.AspNetCore.Mvc.ForbidResult();
            return;
        }
    }

    private bool Authorize(HttpContext httpContext)
    {
        var authorize = false;

        // 通过请求上下文获取DbContext实例
        var coreDb = httpContext.RequestServices.GetRequiredService<CoreDbContext>();

        foreach (var role in _roles)
        {
            var adGroups = coreDb.GetAdGroupsFromRole(role);

            foreach (var adGroup in adGroups.ResultSet1)
            {
                if (httpContext.User.IsInRole(adGroup.ActiveDirectoryGroup))
                {
                    authorize = true;
                    break;
                }
            }

            if (authorize)
                break;
        }

        return authorize;
    }
}

注意:由于自定义属性需要依赖注入,不能直接使用[CustomAuthorize("SomeAzureAppRole")],需改用[TypeFilter(typeof(CustomAuthorizeAttribute), Arguments = new object[] { "SomeAzureAppRole" })]。

4. Account控制器(AccountController.cs)

Core 6 中使用HttpContext处理登录登出:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;

public class AccountController : Controller
{
    public IActionResult SignIn()
    {
        if (!User.Identity.IsAuthenticated)
        {
            return Challenge(new AuthenticationProperties { RedirectUri = "/" }, 
                OpenIdConnectDefaults.AuthenticationScheme);
        }
        return RedirectToAction("Index", "Home");
    }

    public async Task<IActionResult> SignOut()
    {
        await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
        await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme);
        return RedirectToAction("Index", "Home");
    }
}

5. 登录视图(_LoginPartial.cshtml)

替换原_Login.cshtml,使用Core标签助手优化路由:

@if (User.Identity.IsAuthenticated)
{
    <text>
        Hello, @User.Identity.Name <a asp-action="SignOut" asp-controller="Account"> Sign Out</a>
    </text>
}
else
{
    <a asp-action="SignIn" asp-controller="Account">Sign In</a>
}

6. 自定义授权属性使用示例

使用TypeFilter注入依赖并应用授权:

[TypeFilter(typeof(CustomAuthorizeAttribute), Arguments = new object[] { "SomeAzureAppRole" })]
public IActionResult SecureAction()
{
    return View();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:34:56