通过 Azure AD 进行 ASP.NET Core 6 身份验证:自定义登录路径

分享于2022年07月17日 asp.net-core azure-active-directory c# 问答
【问题标题】:通过 Azure AD 进行 ASP.NET Core 6 身份验证:自定义登录路径(ASP.NET Core 6 Authentication via Azure AD: customize login path)
【发布时间】:2022-07-13 20:26:35
【问题描述】:

我正在开发一个 POC,以创建一个 Asp.Net Core 6 Web 应用程序,该应用程序能够通过 Azure AD 身份服务器和自定义本地用户数据库对用户进行身份验证。

我需要创建一个登录页面,用户可以在其中选择两种身份验证方法('/Login/Login')。

当我尝试加载非匿名页面(控制器/操作)时,系统会自动将我重定向到 Microsoft 登录页面,而不是我的自定义页面 (/Login/Login)。

我尝试了一些解决方案,例如:

builder.Services
.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(options => {...}, configureCookieAuthenticationOptions: options =>
{
    options.LoginPath = new PathString("/Login/Login");
})
.EnableTokenAcquisitionToCallDownstreamApi(new[] { "user.read" })
.AddInMemoryTokenCaches();

    builder.Services.ConfigureApplicationCookie(options => {
        options.LoginPath = new PathString("/Login/Login");
    });

但似乎没有任何效果。

有什么建议吗?

谢谢!

  • 谢谢,但他们在那里谈论了 .NET 3/5 API 的身份验证过滤器。我没有看到任何有关用户重定向的信息。我正在考虑制作一个自定义过滤器,但如果有此类功能的选项,我不明白为什么要这样做。 Ps:我忘了提到登录路径仅适用于 AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
  • 重定向是“控制器动作”框的一部分。
  • 我不明白:您是在谈论直接从控制器操作控制流量而无需任何全局过滤器或控制器/操作过滤器的能力吗?那不是办法。
  • 链接中的图片有两个方框。首先用于身份验证,其次用于控制器操作。控制器操作是不属于身份验证的所有内容。

【解决方案1】:

您可以遵循的解决方法之一;

要使用 ASP.nNET 核心应用程序重定向到具有 Microsoft 身份的自定义登录页面,您可以将以下内容添加到您的 startup.cs

  public void ConfigureServices(IServiceCollection services)
    {
        services.Configure(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
            // Handling SameSite cookie according to https://docs.microsoft.com/en-us/aspnet/core/security/samesite?view=aspnetcore-3.1
            options.HandleSameSiteCookieCompatibility();
        });

        // Sign-in users with the Microsoft identity platform
        services.AddMicrosoftIdentityWebAppAuthentication(Configuration);

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

        services.AddRazorPages();
    }

如需完整设置,请参考 GitHub link @ amanmcse

有关详细信息,请参阅此 微软文档 | External Authentication with ASP.NET Identity