如何在针对 Azure AD 注销 ASP.NET Core MVC 应用程序时修复错误 404?

Lés*_*ter 1 c# azure-active-directory asp.net-core-mvc openid-connect

我正在将 ASP.NET Core MVC 3.0 应用程序集成到 Azure AD 以进行身份​​验证和授权,一切正常,但是当我尝试注销时,一旦login.microsoftonline.com我注销,它就会重定向到我的应用程序,然后出现以下错误:

No webpage was found for the web address:

https://localhost:5002/Account/SignOut?page=%2FAccount%2FSignedOut
Run Code Online (Sandbox Code Playgroud)

我用来调用注销过程的路径是/AzureAD/Account/SignOut.

内容appsettings.json

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "[OMITTED]",
    "TenantId": "[OMITTED]",
    "ClientId": "[OMITTED]",
    "CallbackPath": "/signin-oidc"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}
Run Code Online (Sandbox Code Playgroud)

这些是我的Startup.cs课堂内容:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "[OMITTED]",
    "TenantId": "[OMITTED]",
    "ClientId": "[OMITTED]",
    "CallbackPath": "/signin-oidc"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*ney 13

在(至少)最新版本中,您应该 endpoints.MapRazorPages();在 Startup 的 Configure() 方法中添加。这会为您处理路线。

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    endpoints.MapRazorPages();//ADD THIS LINE
});
Run Code Online (Sandbox Code Playgroud)


Lés*_*ter 5

原来,这是一个已知问题Microsoft.AspNetCore.Authentication.AzureAD.UI; 该包在 ASP.NET Core 中实现了 Azure AD 身份验证/授权流程,其中一部分是一个嵌入式AccountController(区域AzureAD),可让您轻松完成登录 - 注销过程。问题是,一旦注销过程完成,该SignOut操作就会硬编码重定向/Account/SignOut?page=%2FAccount%2FSignedOut,这就是问题所在。

我设法通过实现一个小的 AccountController(没有区域)并添加一个SignOut处理来自Microsoft.AspNetCore.Authentication.AzureAD.UI's的重定向的操作来解决它AccountController

[AllowAnonymous]
public class AccountController : Controller
{
    [HttpGet]
    public IActionResult SignOut(string page)
    {
        return RedirectToAction("Index", "Home");
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我花了半天时间来解决这个问题,意识到当我们迁移到 .NET Core 3.0 时它就被破坏了。

我们还迁移到 Microsoft Identity,因为 AzureADB2C UI 被标记为已过时。因此,在ConfigureServices中,我们添加了:

services.AddRazorPages()
            .AddMicrosoftIdentityUI();
Run Code Online (Sandbox Code Playgroud)

...正如 Paul 所说,在配置中我们添加了:

endpoints.MapRazorPages();
Run Code Online (Sandbox Code Playgroud)

这为我们解决了问题。我们从模板中创建一个带有 Microsoft 身份验证的全新 MVC Web 应用程序中得到了提示,并比较了我们的配置服务/配置方法中的差异。