1.4AuthenticationOptions--【AuthenticationOptions->AuthenticationSchemeBuilder->AuthenticationScheme】
AuthenticationOptions->AuthenticationSchemeBuilder->AuthenticationScheme
using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Security.Claims; using Microsoft.AspNetCore.Http; namespace Microsoft.AspNetCore.Authentication { /// <summary> /// Options to configure authentication. /// </summary> public class AuthenticationOptions { private readonly IList<AuthenticationSchemeBuilder> _schemes = new List<AuthenticationSchemeBuilder>(); /// <summary> /// Returns the schemes in the order they were added (important for request handling priority) /// </summary> public IEnumerable<AuthenticationSchemeBuilder> Schemes => _schemes; /// <summary> /// Maps schemes by name. /// </summary> public IDictionary<string, AuthenticationSchemeBuilder> SchemeMap { get; } = new Dictionary<string, AuthenticationSchemeBuilder>(StringComparer.Ordinal); /// <summary> /// Adds an <see cref="AuthenticationScheme"/>. /// </summary> /// <param name="name">The name of the scheme being added.</param> /// <param name="configureBuilder">Configures the scheme.</param> public void AddScheme(string name, Action<AuthenticationSchemeBuilder> configureBuilder) { if (name == null) { throw new ArgumentNullException(nameof(name)); } if (configureBuilder == null) { throw new ArgumentNullException(nameof(configureBuilder)); } if (SchemeMap.ContainsKey(name)) { throw new InvalidOperationException("Scheme already exists: " + name); } var builder = new AuthenticationSchemeBuilder(name); configureBuilder(builder); _schemes.Add(builder); SchemeMap[name] = builder; } /// <summary> /// Adds an <see cref="AuthenticationScheme"/>. /// </summary> /// <typeparam name="THandler">The <see cref="IAuthenticationHandler"/> responsible for the scheme.</typeparam> /// <param name="name">The name of the scheme being added.</param> /// <param name="displayName">The display name for the scheme.</param> public void AddScheme<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]THandler>(string name, string? displayName) where THandler : IAuthenticationHandler => AddScheme(name, b => { b.DisplayName = displayName; b.HandlerType = typeof(THandler); }); /// <summary> /// Used as the fallback default scheme for all the other defaults. /// </summary> public string? DefaultScheme { get; set; } /// <summary> /// Used as the default scheme by <see cref="IAuthenticationService.AuthenticateAsync(HttpContext, string)"/>. /// </summary> public string? DefaultAuthenticateScheme { get; set; } /// <summary> /// Used as the default scheme by <see cref="IAuthenticationService.SignInAsync(HttpContext, string, System.Security.Claims.ClaimsPrincipal, AuthenticationProperties)"/>. /// </summary> public string? DefaultSignInScheme { get; set; } /// <summary> /// Used as the default scheme by <see cref="IAuthenticationService.SignOutAsync(HttpContext, string, AuthenticationProperties)"/>. /// </summary> public string? DefaultSignOutScheme { get; set; } /// <summary> /// Used as the default scheme by <see cref="IAuthenticationService.ChallengeAsync(HttpContext, string, AuthenticationProperties)"/>. /// </summary> public string? DefaultChallengeScheme { get; set; } /// <summary> /// Used as the default scheme by <see cref="IAuthenticationService.ForbidAsync(HttpContext, string, AuthenticationProperties)"/>. /// </summary> public string? DefaultForbidScheme { get; set; } /// <summary> /// If true, SignIn should throw if attempted with a user is not authenticated. /// A user is considered authenticated if <see cref="ClaimsIdentity.IsAuthenticated"/> returns <see langword="true" /> for the <see cref="ClaimsPrincipal"/> associated with the HTTP request. /// </summary> public bool RequireAuthenticatedSignIn { get; set; } = true; } }
using System; using System.Diagnostics.CodeAnalysis; namespace Microsoft.AspNetCore.Authentication { /// <summary> /// Used to build <see cref="AuthenticationScheme"/>s. /// </summary> public class AuthenticationSchemeBuilder { /// <summary> /// Constructor. /// </summary> /// <param name="name">The name of the scheme being built.</param> public AuthenticationSchemeBuilder(string name) { Name = name; } /// <summary> /// Gets the name of the scheme being built. /// </summary> public string Name { get; } /// <summary> /// Gets or sets the display name for the scheme being built. /// </summary> public string? DisplayName { get; set; } /// <summary> /// Gets or sets the <see cref="IAuthenticationHandler"/> type responsible for this scheme. /// </summary> [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] public Type? HandlerType { get; set; } /// <summary> /// Builds the <see cref="AuthenticationScheme"/> instance. /// </summary> /// <returns>The <see cref="AuthenticationScheme"/>.</returns> public AuthenticationScheme Build() { if (HandlerType is null) { throw new InvalidOperationException($"{nameof(HandlerType)} must be configured to build an {nameof(AuthenticationScheme)}."); } return new AuthenticationScheme(Name, DisplayName, HandlerType); } } }
using System; using System.Diagnostics.CodeAnalysis; namespace Microsoft.AspNetCore.Authentication { /// <summary> /// AuthenticationSchemes assign a name to a specific <see cref="IAuthenticationHandler"/> /// handlerType. /// </summary> public class AuthenticationScheme { /// <summary> /// Initializes a new instance of <see cref="AuthenticationScheme"/>. /// </summary> /// <param name="name">The name for the authentication scheme.</param> /// <param name="displayName">The display name for the authentication scheme.</param> /// <param name="handlerType">The <see cref="IAuthenticationHandler"/> type that handles this scheme.</param> public AuthenticationScheme(string name, string? displayName, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type handlerType) { if (name == null) { throw new ArgumentNullException(nameof(name)); } if (handlerType == null) { throw new ArgumentNullException(nameof(handlerType)); } if (!typeof(IAuthenticationHandler).IsAssignableFrom(handlerType)) { throw new ArgumentException("handlerType must implement IAuthenticationHandler."); } Name = name; HandlerType = handlerType; DisplayName = displayName; } /// <summary> /// The name of the authentication scheme. /// </summary> public string Name { get; } /// <summary> /// The display name for the scheme. Null is valid and used for non user facing schemes. /// </summary> public string? DisplayName { get; } /// <summary> /// The <see cref="IAuthenticationHandler"/> type that handles this scheme. /// </summary> [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] public Type HandlerType { get; } } }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步