AzureAD/OIDC .Net Framework 和 .Net Core 中的身份验证差异

AzureAD/OIDC authentication differences in .Net Framework and .Net Core

我正在尝试在 ASP.Net 核心应用程序中使用 AzureAD 身份验证,并使一些控制器操作不需要用户登录。

使用 Visual Studio 2019,如果我创建一个全新的 ASP.Net 框架应用程序和 select Work/School 帐户进行身份验证 - HomeController 装饰有 Authorize 属性。一旦我 运行 应用程序,我就会被重定向到 Azure 登录屏幕。如果我将 Authorize 属性从 Home 控制器的顶部移动到 Contact 操作,当我 运行 应用程序时,我不会被重定向到登录,直到我单击 Contact link。这正是我所期望的。

如果我创建一个全新的 ASP.Net 核心应用程序(再次 selecting Work/School 帐户进行身份验证)- 并将授权属性从 Home 控制器的顶部移动到隐私操作 - 我一 运行 应用程序就被重定向到登录,而不是等待我导航到隐私操作。

代码示例

这个

[Authorize]
public class HomeController : Controller
...
public IActionResult Privacy()
...

与此行为相同

public class HomeController : Controller
...
[Authorize]
public IActionResult Privacy()
...

在ASP.Net核心。

1) 这两者之间的身份验证有何不同? 2) 有没有一种简单的方法可以使 ASP.Net 核心应用程序仅在点击 Authorize 属性时进行身份验证?

这是因为 asp.net 核心模板创建了一个全局 AuthorizeFilter 以确保所有操作都需要经过身份验证的用户才能访问:

.NET 核心 2.x :

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

.Net Core 3.x:

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

您可以删除过滤器:

.NET 核心 2.x :

services.AddMvc()

.NET 核心 3.x :

services.AddControllersWithViews();