适用于: 员工租户
外部租户(了解详细信息)
在本教程中,将身份验证和授权元素添加到 ASP.NET Core Web 应用。 在 上一教程中,你创建了一个 ASP.NET Core 项目并将其配置为身份验证。
在本教程中,你将:
- 将授权和身份验证元素添加到代码
- 启用在 ID 令牌中查看声明信息
- 添加登录和退出登录体验
先决条件
- 完成教程中的先决条件和步骤 :设置对用户进行身份验证的 ASP.NET Core Web 应用。
添加身份验证和授权元素
需要修改 HomeController.cs 和 Program.cs 文件,将身份验证和授权元素添加到 ASP.NET Core Web 应用。 这包括管理主页、添加正确的命名空间和配置登录。
向 HomeController.cs 添加授权
应用程序的主页需要能够授权用户。 命名空间 Microsoft.AspNetCore.Authorization
提供用于实现 Web 应用的授权的类和接口。 该 [Authorize]
属性用于指定只有经过身份验证的用户才能使用 Web 应用。
在 Web 应用中,打开 Controllers/HomeController.cs,并将以下代码片段添加到文件顶部:
using System.Diagnostics; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using dotnetcore_webapp.Models;
在
[Authorize]
类定义的上方添加HomeController
属性,如以下代码片段所示:[Authorize] public class HomeController : Controller { ...
将身份验证和授权元素添加到 Program.cs
Program.cs文件是应用程序的入口点,需要对其进行修改才能将身份验证和授权添加到 Web 应用。 需要添加服务以允许应用使用 appsettings.json 中定义的设置进行身份验证。
将以下命名空间添加到文件顶部。
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;
接下来,添加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();
接下来,需要将中间件配置为启用身份验证功能。 将代码的其余部分替换为以下代码片段。
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 令牌声明。
在 Views/Shared 中创建一个新文件,并将其命名 为 _LoginPartial.cshtml。
打开该文件并添加以下代码以添加登录和注销体验:
@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>
打开 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 域(可选)
适用于: 员工租户
外部租户(了解详细信息)
使用自定义域对身份验证 URL 进行完全品牌化。 从用户的角度来看,用户在身份验证过程中保留在您的域名上,而不是被重定向到 ciamlogin.com 域名。
按照以下步骤使用自定义域:
使用启用外部租户中应用的自定义 URL 域名中的步骤,为您的外部租户启用自定义 URL 域名。
打开 appsettings.json 文件:
- 将
Instance
和TenantId
参数更改为Authority
属性。 - 在
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,请了解如何读取租户详细信息。 - 添加一个属性,其值为 [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"]
...