Поделиться через


Руководство. Настройка веб-приложения ASP.NET Core для авторизации и проверки подлинности

применяется к: зеленый круг с символом белой флажки. арендаторы рабочей силы зеленый круг с символом белой галочки. внешние клиенты (подробнее)

В этом руководстве вы добавите элементы проверки подлинности и авторизации в веб-приложение ASP.NET Core. В предыдущем руководстве вы создали проект ASP.NET Core и настроили его для проверки подлинности.

В этом руководстве:

  • Добавление элементов авторизации и проверки подлинности в код
  • Включение просмотра утверждений в маркере идентификатора
  • Добавление возможностей входа и выхода

Необходимые условия

Добавление элементов проверки подлинности и авторизации

Файлы HomeController.cs и Program.cs необходимо изменить, чтобы добавить элементы проверки подлинности и авторизации в веб-приложение ASP.NET Core. Это включает управление домашней страницей, добавление корректных пространств имен и конфигурацию входа.

Добавление авторизации в HomeController.cs

Домашняя страница приложения должна иметь возможность авторизовать пользователя. Пространство имен Microsoft.AspNetCore.Authorization предоставляет классы и интерфейсы для реализации авторизации в веб-приложении. Атрибут [Authorize] используется для указания того, что только прошедшие проверку подлинности пользователи могут использовать веб-приложение.

  1. В веб-приложении откройте контроллеры /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 является точкой входа приложения и необходимо изменить для добавления проверки подлинности и авторизации в веб-приложение. Необходимо добавить службы, чтобы разрешить приложению использовать параметры, определенные в 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 Identity Web App, которая настраивает приложение на использование удостоверений Майкрософт для проверки подлинности.

    // 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();
    

Добавление интерфейса входа и выхода

Пользовательский интерфейс должен быть обновлен, чтобы обеспечить более удобный интерфейс для входа и выхода. В этом разделе показано, как создать новый файл, отображающий элементы навигации на основе состояния проверки подлинности пользователя. Код считывает утверждения маркера идентификатора, чтобы убедиться, что пользователь прошел проверку подлинности и использует User.Claims для извлечения утверждений маркера идентификатора.

  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. Обновите параметры Instance и TenantId для свойства 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 идентификатором клиента. Если у вас нет идентификатора арендатора, ознакомьтесь с тем, как прочитать сведения об арендаторе.
    3. Добавьте свойство knownAuthorities со значением [Enter_the_Custom_Domain_Here].

После внесения изменений в файл appsettings.json, если ваш личный URL-адрес login.contoso.com, и идентификатор арендатора aaaabbbb-0000-cccc-1111-dddd2222eeee, ваш файл должен выглядеть следующим образом:

{
  "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"]
    ...

Следующий шаг