C# .NET核心2.2标识+;WebAPI的基本身份验证

C# .NET核心2.2标识+;WebAPI的基本身份验证,c#,.net-core,basic-authentication,asp.net-core-identity,C#,.net Core,Basic Authentication,Asp.net Core Identity,我正在开发一个包含用户界面和API的软件。对于身份验证和授权,我使用了.NET CORE Identity 2.2 我工作得很好。现在我有了API函数,它们有两个不同的要求: 1.用户界面使用的API端点(AJAX调用等…) 2.可由其他软件使用的API端点 因此,我想使用两种不同的授权方法。对于第1点,我使用.NET核心身份验证和身份验证。对于第2点,我想使用基本的AUTH 如何配置这些不同的授权方法。下面是一个示例代码: 基本身份验证代码 尝试在ConfigureServices中添加对Ba

我正在开发一个包含用户界面和API的软件。对于身份验证和授权,我使用了.NET CORE Identity 2.2

我工作得很好。现在我有了API函数,它们有两个不同的要求: 1.用户界面使用的API端点(AJAX调用等…) 2.可由其他软件使用的API端点

因此,我想使用两种不同的授权方法。对于第1点,我使用.NET核心身份验证和身份验证。对于第2点,我想使用基本的AUTH

如何配置这些不同的授权方法。下面是一个示例代码:

基本身份验证代码

  • 尝试在ConfigureServices中添加对BasuicAuth的服务支持
    services.AddAuthentication(“BasicAuth”).AddScheme(“BasicAuth”,null)

  • 生成基本身份验证处理程序

    public class BasicAuthHandler : AuthenticationHandler<AuthenticationSchemeOptions>
    {
    
        IConfiguration _configuration;
    
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="options"></param>
        /// <param name="logger"></param>
        /// <param name="encoder"></param>
        /// <param name="clock"></param>
        /// <param name="configuration"></param>
        public BasicAuthHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock, IConfiguration configuration) : base(options, logger, encoder, clock)
        {
            _configuration = configuration;
        }
    
        /// <summary>
        /// Handels the Authentication by using Basic Auth
        /// --> Checks the configured values by 
        /// </summary>
        /// <returns></returns>
        protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
        {
            if (!Request.Headers.ContainsKey("Authorization"))
            {
                return AuthenticateResult.Fail("Missing Authorization Header");
            }
            try
            {
                var authHeader = AuthenticationHeaderValue.Parse(Request.Headers["Authorization"]);
                var credentialsByes = Convert.FromBase64String(authHeader.Parameter);
                var credentials = Encoding.UTF8.GetString(credentialsByes).Split(':');
    
                var configuredUserName = _configuration["BasicAuth:Username"];
                var configuredPassword = _configuration["BasicAuth:Password"];
    
                if (configuredUserName.Equals(credentials[0]) & configuredPassword.Equals(credentials[1]))
                {
                    var claims = new[] {
                        new Claim(ClaimTypes.Name, credentials[0])
                    };
                    var identity = new ClaimsIdentity(claims, Scheme.Name);
                    var principal = new ClaimsPrincipal(identity);
                    var ticket = new AuthenticationTicket(principal, Scheme.Name);
                    return AuthenticateResult.Success(ticket);
                }
                else
                {
                    return AuthenticateResult.Fail("Invalid Credentials");
                }
            }
            catch
            {
                return AuthenticateResult.Fail("Invalid Authorization Header");
            }
        }
    }
    
    每次.NET核心标识授权时都会使用授权批注

  • 另一种情况是对UI API使用.NET核心身份授权

    [ApiController]
    [ApiVersion("1.0", Deprecated = false)]
    [Produces("application/json")]
    [Route("api/v{version:apiVersion}/[controller]")]
    [Authorize(Roles = "SuperUser,PlantAdministrator,EndUser")]
    public class UploadController : ControllerBase
    {...}
    

    这非常有效-但我想使用一个组合…

    我找到了一个解决方案。您可以通过向Authorize注释添加参数来完成此操作,如下所示:

    [ApiController]
    [ApiVersion("1.0", Deprecated = false)]
    [Produces("application/json")]
    [Route("api/v{version:apiVersion}/[controller]")]
    [Authorize(ActiveAuthenticationSchemes = "BasicAuth")]
    public class MasterDataController : ControllerBase
    {...}
    
    如果将ActiveAuthenticationSchemes设置为Basic Auth,则会查找兼容的AuthenticationHandler

    [ApiController]
    [ApiVersion("1.0", Deprecated = false)]
    [Produces("application/json")]
    [Route("api/v{version:apiVersion}/[controller]")]
    [Authorize(ActiveAuthenticationSchemes = "BasicAuth")]
    public class MasterDataController : ControllerBase
    {...}