以下是一个基本的ASP.Net Core Web API和持久化基本身份验证的解决方案示例:
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public string Password { get; set; }
}
public class UserDbContext : DbContext
{
public UserDbContext(DbContextOptions options) : base(options)
{
}
public DbSet Users { get; set; }
}
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddAuthentication("BasicAuthentication")
.AddScheme("BasicAuthentication", null);
services.AddControllers();
}
public class BasicAuthenticationHandler : AuthenticationHandler
{
private readonly UserDbContext _dbContext;
public BasicAuthenticationHandler(
IOptionsMonitor options,
ILoggerFactory logger,
UrlEncoder encoder,
ISystemClock clock,
UserDbContext dbContext)
: base(options, logger, encoder, clock)
{
_dbContext = dbContext;
}
protected override async Task HandleAuthenticateAsync()
{
if (!Request.Headers.ContainsKey("Authorization"))
return AuthenticateResult.Fail("Missing Authorization Header");
User user = null;
try
{
var authorizationHeader = AuthenticationHeaderValue.Parse(Request.Headers["Authorization"]);
var credentials = Encoding.UTF8.GetString(Convert.FromBase64String(authorizationHeader.Parameter)).Split(':');
var username = credentials[0];
var password = credentials[1];
user = await _dbContext.Users.FirstOrDefaultAsync(u => u.Username == username && u.Password == password);
}
catch
{
return AuthenticateResult.Fail("Invalid Authorization Header");
}
if (user == null)
return AuthenticateResult.Fail("Invalid Username or Password");
var claims = new[] { new Claim(ClaimTypes.Name, user.Username) };
var identity = new ClaimsIdentity(claims, Scheme.Name);
var principal = new ClaimsPrincipal(identity);
var ticket = new AuthenticationTicket(principal, Scheme.Name);
return AuthenticateResult.Success(ticket);
}
}
[Authorize]
[ApiController]
[Route("[controller]")]
public class UserController : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
var username = User.Identity.Name;
return Ok($"Hello, {username}");
}
}
现在,你可以使用基本身份验证来访问UserController中的Get方法,只有在提供正确的用户名和密码时才能成功访问。