教程:为 ASP.NET Core Web 应用配置授权和身份验证

适用于:带白色勾号的绿色圆圈。 员工租户 带白色勾号的绿色圆圈。 外部租户(了解详细信息

在本教程中,将身份验证和授权元素添加到 ASP.NET Core Web 应用。 在 上一教程中,你创建了一个 ASP.NET Core 项目并将其配置为身份验证。

在本教程中,你将:

  • 将授权和身份验证元素添加到代码
  • 启用在 ID 令牌中查看声明信息
  • 添加登录和退出登录体验

先决条件

添加身份验证和授权元素

需要修改 HomeController.csProgram.cs 文件,将身份验证和授权元素添加到 ASP.NET Core Web 应用。 这包括管理主页、添加正确的命名空间和配置登录。

HomeController.cs 添加授权

应用程序的主页需要能够授权用户。 命名空间 Microsoft.AspNetCore.Authorization 提供用于实现 Web 应用的授权的类和接口。 该 [Authorize] 属性用于指定只有经过身份验证的用户才能使用 Web 应用。

  1. 在 Web 应用中,打开 Controllers/HomeController.cs,并将以下代码片段添加到文件顶部:

    using System.Diagnostics;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Mvc;
    using dotnetcore_webapp.Models;
    
  2. [Authorize] 类定义的上方添加 HomeController 属性,如以下代码片段所示:

    [Authorize]
    public class HomeController : Controller
    {
    ...
    

将身份验证和授权元素添加到 Program.cs

Program.cs文件是应用程序的入口点,需要对其进行修改才能将身份验证和授权添加到 Web 应用。 需要添加服务以允许应用使用 appsettings.json 中定义的设置进行身份验证。

  1. 将以下命名空间添加到文件顶部。

    using Microsoft.AspNetCore.Authentication.OpenIdConnect;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Mvc.Authorization;
    using Microsoft.Identity.Web;
    using Microsoft.Identity.Web.UI;
    using System.IdentityModel.Tokens.Jwt;
    
  2. 接下来,添加Microsoft标识 Web 应用身份验证服务,该服务将应用配置为使用Microsoft标识进行身份验证。

    // Add services to the container.
    builder.Services.AddControllersWithViews();
    
    // This is required to be instantiated before the OpenIdConnectOptions starts getting configured.
    // By default, the claims mapping will map claim names in the old format to accommodate older SAML applications.
    // This flag ensures that the ClaimsIdentity claims collection will be built from the claims in the token
    JwtSecurityTokenHandler.DefaultMapInboundClaims = false;
    
    // Sign-in users with the Microsoft identity platform
    builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(builder.Configuration)
        .EnableTokenAcquisitionToCallDownstreamApi()
        .AddInMemoryTokenCaches();
    
    builder.Services.AddControllersWithViews(options =>
    {
        var policy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();
        options.Filters.Add(new AuthorizeFilter(policy));
    }).AddMicrosoftIdentityUI();
    
    
  3. 接下来,需要将中间件配置为启用身份验证功能。 将代码的其余部分替换为以下代码片段。

    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.UseAuthorization();
    
    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    
    app.Run();
    

添加登录和退出登录体验

UI 需要更新才能为登录和注销提供更用户友好的体验。本部分介绍如何创建一个新文件,以基于用户的身份验证状态显示导航项。 该代码读取 ID 令牌声明以检查用户是否已通过身份验证,并使用 User.Claims 提取 ID 令牌声明。

  1. Views/Shared 中创建一个新文件,并将其命名 为 _LoginPartial.cshtml

  2. 打开该文件并添加以下代码以添加登录和注销体验:

    @using System.Security.Principal
    
    <ul class="navbar-nav">
    @if (User.Identity is not null && User.Identity.IsAuthenticated)
    {
            <li class="nav-item">
                <span class="nav-link text-dark">Hello @User.Claims.First(c => c.Type == "preferred_username").Value!</span>
            </li>
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="SignOut">Sign out</a>
            </li>
    }
    else
    {
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="SignIn">Sign in</a>
            </li>
    }
    </ul>
    
  3. 打开 Views/Shared/_Layout.cshtml ,并添加对 _LoginPartial 在上一步中创建的引用。 将其放置在 navbar-nav 类的末尾附近,如以下代码片段所示:

    <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
        <ul class="navbar-nav flex-grow-1">
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
            </li>
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
            </li>
        </ul>
        <partial name="_LoginPartial" />
    </div>
    

使用自定义 URL 域(可选)

适用于:带灰色 X 号的白色圆圈。 员工租户 带白色对号的绿色圆圈。 外部租户(了解详细信息

使用自定义域对身份验证 URL 进行完全品牌化。 从用户的角度来看,用户在身份验证过程中保留在您的域名上,而不是被重定向到 ciamlogin.com 域名。

按照以下步骤使用自定义域:

  1. 使用启用外部租户中应用的自定义 URL 域名中的步骤,为您的外部租户启用自定义 URL 域名。

  2. 打开 appsettings.json 文件:

    1. InstanceTenantId 参数更改为 Authority 属性。
    2. Authority 值添加以下字符串,以 https://Enter_the_Custom_Domain_Here/Enter_the_Tenant_ID_Here。 将 Enter_the_Custom_Domain_Here 替换为您的自定义 URL 域,并将 Enter_the_Tenant_ID_Here 替换为您的租户 ID。 如果没有租户 ID,请了解如何读取租户详细信息
    3. 添加一个属性,其值为 [Enter_the_Custom_Domain_Here]

appsettings.json 文件进行更改后,如果自定义 URL 域 login.contoso.com,并且租户 ID 为 aaaabb-0000-cccc-1111-dd222eeee,则文件应类似于以下代码片段:

{
  "AzureAd": {
    "Authority": "https://login.contoso.com/aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "ClientId": "Enter_the_Application_Id_Here",
    "ClientCertificates": [
      {
        "SourceType": "StoreWithThumbprint",
        "CertificateStorePath": "CurrentUser/My",
        "CertificateThumbprint": "AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00"
      }   
    ],
    "CallbackPath": "/signin-oidc",
    "SignedOutCallbackPath": "/signout-callback-oidc",
    "KnownAuthorities": ["login.contoso.com"]
    ...

后续步骤