ASP.NET Core 6.0 - 基于声明的授权
本文介绍基于声明的授权的实现。我假设您已经下载了Core 6.0 - 设备2FA项目的用户 ASP.NET。
使用设备的用户 2FA 项目和文章系列
本系列文章介绍了 ASP.NET 核心 6.0 与 Visual Studio 2022 的实现。ASP.NET 核心 6.0 - 具有设备 2FA 项目 (UWD2FAP) 的用户实现 WebAuthn(也称为 FIDO2),而不是用于双重身份验证 (2FA) 的身份验证器应用。该项目实现引导 v5 和引导本机。用户注册后,他们可以使用 Windows 你好、安卓锁屏或 FIDO2 安全密钥启用 2FA。如果我在创建肯哈格蒂时有这个项目。Com 三年前,我会从这个用户身份验证模板开始。最新版本在预览版中发布。肯哈格蒂。通讯社我鼓励您在“管理帐户>双因素身份验证”中注册和评估多个2FA设备。有关详细信息、屏幕截图和相关文章,请参阅 Core 6.0 - 使用设备 2FA 项目的用户 ASP.NET。详细信息页面包括版本更改日志。
- ASP.NET 核心 6.0 - 使用设备 2FA 的用户
- ASP.NET 核心 6.0 - 从 .NET 5.0 迁移
- ASP.NET 核心 6.0 - 顶级语句
- ASP.NET 核心 6.0 - 全球使用
- ASP.NET Core 6.0 - 数据保护密钥
- ASP.NET 核心 6.0 - 管理员声明
- ASP.NET 核心 6.0 - 服务条款
- ASP.NET Core 6.0 - 基于声明的授权
- ASP.NET 核心 6.0 - 模拟用户
- ASP.NET 核心6.0 - 记住我与否
- ASP.NET 核心 6.0 - 零信任
在文章发布时使用链接进行更新。
简单来说,身份验证是验证用户是谁的过程,而授权是验证他们有权访问的内容的过程。
将这些流程与实际示例进行比较,当您在机场通过安检时,您需要出示您的身份证件以验证您的身份。然后,当您到达登机口时,您向乘务员出示登机牌,以便他们授权您登机并允许进入飞机。AUTH0 - 什么是身份验证和授权?
在核心或基于声明的访问控制 (CBAC) ASP.NET 基于声明的授权并不容易。虽然 ASP.NET 核心或基于角色的访问控制 (RBAC) 中基于角色的授权可能更易于理解和实现,但 CBAC 通过支持最小特权原则,可以更精细地控制用户可以访问的内容。最小特权的信息安全原则断言,应仅向用户和应用程序授予对执行其工作所需的数据和操作的访问权限。请参阅使用最小特权原则增强安全性。RBAC 是使用预定义的声明类型.角色实现的。CBAC 通过声明标识和授权策略实现。策略表示授权要求的集合以及评估这些要求的一个或多个方案,所有这些方案都必须成功才能使授权成功。
硬部件目录
如何允许具有任何授权声明的用户访问 “/Admin/索引” 页。
如何允许具有管理员声明的用户成功满足所有要求。
如何将管理员与非管理员隔离开来。
如何要求为所有策略启用双重身份验证。
如何允许具有任何授权声明的用户导航到“/Admin/索引”页。
硬质零件的解决方案。
类是基于声明的标识的具体实现。即,由声明集合描述的标识。声明是由颁发者对实体做出的声明,用于描述该实体的属性、权利或其他质量。这种实体被称为索赔的标的。声明由声明类表示。声明标识中包含的声明描述相应标识所表示的实体,并可用于做出授权和身份验证决策。与完全依赖于角色的更传统的访问模型相比,基于声明的访问模型具有许多优势。例如,声明可以提供有关它们所表示的标识的更丰富的信息,并且可以以更具体的方式评估授权或身份验证。声明标识类
UWD2FAP 实现应用用户声明实体以存储应用用户的声明属性。SignInService 中的“创建用户”原则辅助同步方法添加“名称标识符”、“名称”、“Sid”和“身份验证方法”预定义的声明类型,然后为每个应用用户声明添加一个声明。
服务 > 登录服务
/// <summary>
/// Creates a <see cref="ClaimsPrincipal"/> for the <paramref name="appUser"/>, asynchronous.
/// </summary>
/// <param name="appUser">The the user to create a <see cref="ClaimsPrincipal"/> for.</param>
/// <param name="authenticationMethod">Name of the method used to authenticate the user.</param>
/// <returns><see cref="Task{TResult}"/> for <see cref="ClaimsPrincipal"/></returns>
private async Task<ClaimsPrincipal> CreateUserPrincipalAsync(AppUser appUser, string authenticationMethod)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, appUser.Id.ToString(), ClaimValueTypes.Integer, AppSettings.ClaimIssuer),
new Claim(ClaimTypes.Name, appUser.LoginName, ClaimValueTypes.String, AppSettings.ClaimIssuer),
new Claim(ClaimTypes.Sid, appUser.SecurityStamp, ClaimValueTypes.String, AppSettings.ClaimIssuer),
new Claim(ClaimTypes.AuthenticationMethod, authenticationMethod, ClaimValueTypes.String, AppSettings.ClaimIssuer)
};
var appUserClaims = await _userService.GetAppUserClaimsByAppUserIdAsync(appUser.Id).ConfigureAwait(false);
foreach (var appUserClaim in appUserClaims)
claims.Add(new Claim(appUserClaim.Type, appUserClaim.Value, appUserClaim.ValueType!, AppSettings.ClaimIssuer));
return new ClaimsPrincipal(new ClaimsIdentity(claims, AppSettings.ApplicationScheme));
}
The UWD2FAP implements user claims like TwoFactorEnabled, TermsOfService, MustChangePassword, and authorization claims. To manage authorization claims, I developed an AuthorizationClaims class which holds the generic Claim values. The UWD2FAP defines application claims with AppSettings, AppClaimTypes, and AppClaimValues static classes which define constants for the claim.
AuthorizationClaims.cs
// Copyright © Ken Haggerty (https://kenhaggerty.com)
// Licensed under the MIT License.
namespace UsersWithDevice2FA.Models.AppClaims;
/// <summary>
/// Generic readonly list of all <see cref="Claim"/> used for authorization.
/// </summary>
public static class AuthorizationClaims
{
public static readonly Claim Administrator = new(AppClaimTypes.Super, AppClaimValues.Administrator,
ClaimValueTypes.String, AppSettings.ClaimIssuer);
public static readonly Claim Security = new(AppClaimTypes.Super, AppClaimValues.Security,
ClaimValueTypes.String, AppSettings.ClaimIssuer);
public static readonly Claim EmailRead = new(AppClaimTypes.Email, AppClaimValues.Read,
ClaimValueTypes.String, AppSettings.ClaimIssuer);
public static readonly Claim EmailWrite = new(AppClaimTypes.Email, AppClaimValues.Write,
ClaimValueTypes.String, AppSettings.ClaimIssuer);
public static readonly Claim EmailSend = new(AppClaimTypes.Email, AppClaimValues.Send,
ClaimValueTypes.String, AppSettings.ClaimIssuer);
public static readonly Claim AppUserRead = new(AppClaimTypes.AppUser, AppClaimValues.Read,
ClaimValueTypes.String, AppSettings.ClaimIssuer);
public static readonly Claim AppUserWrite