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

如何修改Visual Studio默认Microsoft身份认证启动逻辑

问题描述

我负责的网页要求用户使用Microsoft账号登录,基于Microsoft Identity Platform完成身份认证,但当前测试/生产环境一打开就直接跳转至Microsoft登录页。我需要先展示自定义“登录”视图,点击“使用Microsoft账号登录”按钮再触发认证流程,想知道要修改哪些默认配置,附上相关代码及效果:

Program.cs 代码

using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.Identity.Web;
using Microsoft.Identity.Web.UI;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"));

builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = options.DefaultPolicy;
});

builder.Services.AddControllersWithViews(options =>
{
    var policy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
    options.Filters.Add(new AuthorizeFilter(policy));
});
builder.Services.AddRazorPages()
    .AddMicrosoftIdentityUI();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

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

app.Run();

当前启动效果

当前登录跳转效果

期望的登录页代码

<form id="form_login" action="~/Home/LoginMicrosoft" method="post">
    <div class="input">
        <input type="submit" value="Use Microsoft account"/>
        <span id="ver_clave" class="ver_clave input-group-append">
            <i class="fa-brands fa-microsoft"></i>
        </span>
    </div>
</form>

尝试的控制器代码

[HttpPost]
public async Task<IActionResult> LoginMicrosoft ()
{
    try
    {
        MicrosoftAuthService aut = new MicrosoftAuthService();
        aut.Initialize();
        await aut.OnSignInAsync();

        return View("Index");
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

解决方案

问题核心是全局强制要求认证导致自动跳转,同时认证配置默认开启了自动挑战。按以下步骤修改即可,不会破坏原有认证逻辑:

1. 移除全局授权过滤器

打开Program.cs,修改AddControllersWithViews的配置,去掉全局的AuthorizeFilter,默认所有页面允许匿名访问,仅在需要认证的控制器/方法上手动添加[Authorize]:

// 修改后代码
builder.Services.AddControllersWithViews();

2. 调整授权策略

修改AddAuthorization配置,取消默认的全局认证要求,保留默认策略供[Authorize]使用:

builder.Services.AddAuthorization(options =>
{
    // 设置默认 fallback 策略为允许匿名
    options.FallbackPolicy = new AuthorizationPolicyBuilder()
        .AllowAnonymous()
        .Build();
    // 保留默认认证策略,需要时通过[Authorize]引用
    options.DefaultPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
});

3. 禁用认证自动挑战

修改AddMicrosoftIdentityWebApp的配置,禁用自动跳转到Microsoft登录页的行为:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"), options =>
    {
        // 关闭自动挑战,避免未认证时自动跳转登录
        options.AutomaticChallenge = false;
    });

4. 修正登录按钮触发逻辑

不需要自定义MicrosoftAuthService,直接使用ASP.NET Core内置的认证挑战方法修改控制器代码:

using Microsoft.AspNetCore.Authentication.OpenIdConnect;

// ...

[HttpPost]
public async Task<IActionResult> LoginMicrosoft()
{
    // 触发Microsoft认证流程,登录后跳转至首页
    var authProperties = new AuthenticationProperties { RedirectUri = "/" };
    return Challenge(authProperties, OpenIdConnectDefaults.AuthenticationScheme);
}

5. 配置页面权限

  • 给自定义登录页的控制器方法添加[AllowAnonymous],确保未认证用户能访问:
public class HomeController : Controller
{
    [AllowAnonymous]
    public IActionResult Login()
    {
        return View(); // 返回自定义登录视图
    }

    // 需要认证的页面添加[Authorize]
    [Authorize]
    public IActionResult Index()
    {
        return View();
    }
}
  • 可选:修改默认路由,让网站启动时默认打开登录页:
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Login}/{id?}");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:40:38