• .NET Core身份认证中的Basic认证方式详解
  • 发布于 2个月前
  • 109 热度
    0 评论
  • 苒青绾
  • 0 粉丝 23 篇博客
  •   
1. 什么是Basic Authentication?
在http请求的上下文中,Basic Authentication是HTTP用户代理(例如Web浏览器)在发出请求时提供用户名和密码的一种方法,在Basic 身份认证中,请求包含了一个Authorization: Basic <credentials>头部字段,其中credentials是ID和密码用单个冒号:连接后的Base64编码

2. 特性
HTTP基本身份验证(BA)实现是强制访问控制到Web资源的最简单技术,因为它不需要cookies、会话标识符或登录页面;相反,HTTP基本身份验证使用HTTP头中的标准字段

3. 安全性
安全性比较差,对用户名和密码只进行了Base64的编码,而没有进行加密和哈希处理

4.ASP.NET Core 中使用Basic Authentication
我们新建一个AspNetCore.API.BasicAuthentication的API的项目,在项目中新增一个BasicAuthController控制器,控制器中添加一个Action方法:

我们在项目根目录下新建一个Handler文件夹,在该文件夹下新建一个BasicAuthenticationHandler类:
using Microsoft.AspNetCore.Authentication;
using Microsoft.Extensions.Options;
using System.Security.Claims;
using System.Text;
using System.Text.Encodings.Web;
namespace AspNetCore.API.BasicAuthentication.Handler
{
    public class BasicAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
    {
        public BasicAuthenticationHandler(
            IOptionsMonitor<AuthenticationSchemeOptions> options,
            ILoggerFactory logger,
            UrlEncoder encoder,
            ISystemClock clock) : base(options, logger, encoder, clock)
        {
        }

        protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
        {
            if (!Request.Headers.ContainsKey("Authorization"))
            {
                return AuthenticateResult.Fail("Unauthorized");
            }
            string authorizationHeader = Request.Headers["Authorization"];
            if (string.IsNullOrEmpty(authorizationHeader))
            {
                return AuthenticateResult.Fail("Unauthorized");
            }

            if (!authorizationHeader.StartsWith("basic ", StringComparison.OrdinalIgnoreCase))
            {
                return AuthenticateResult.Fail("Unauthorized");
            }
            var token = authorizationHeader.Substring(6);
            var credentialAsString = Encoding.UTF8.GetString(Convert.FromBase64String(token));

            var credentials = credentialAsString.Split(":");
            if (credentials?.Length != 2)
            {
                return AuthenticateResult.Fail("Unauthorized");
            }
            var username = credentials[0];
            var password = credentials[1];

            if (username != "guibingbing" && password != "123456")
            {
                return AuthenticateResult.Fail("Authentication failed");
            }

            var claims = new[]
            {
                new Claim(ClaimTypes.NameIdentifier, username)
            };
            var identity = new ClaimsIdentity(claims, "Basic");
            var claimsPrincipal = new ClaimsPrincipal(identity);
            return AuthenticateResult.Success(new AuthenticationTicket(claimsPrincipal, Scheme.Name));
        }
    }
}
接下来在启动类中添加如下代码:

运行应用程序:

我们可以在页面上输入用户名和密码,点击授权:

当我们再次访问API的时候,我们可以看到我们的API调用成功:

我们也可以在后台用户API中获取登录的用户信息:

Basic Authentication 主要应用于安全度不高的应用场景,因为用户名和密码只是简单进行了base64的编码,就相当于明文传输。安全特别要求特别的高应用场景不太适合。
用户评论