Learn.Archives/Learn.Archives.Core/Common/BasicAuthMiddleware.cs

57 lines
1.9 KiB
C#

using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using OracleInternal.Secure.Network;
using System;
using System.Text;
using System.Threading.Tasks;
namespace Learn.Archives.Core.Common
{
public class BasicAuthMiddleware
{
private readonly RequestDelegate _next;
private readonly string _realm;
public BasicAuthMiddleware(RequestDelegate next, string realm)
{
_next = next;
_realm = realm;
}
public async Task InvokeAsync(HttpContext context)
{
if (context.Request.Path.StartsWithSegments("/swagger"))
{
string authHeader = context.Request.Headers["Authorization"];
if (authHeader != null && authHeader.StartsWith("Basic "))
{
var encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim();
var decodedUsernamePassword = Encoding.UTF8.GetString(Convert.FromBase64String(encodedUsernamePassword));
var usernamePassword = decodedUsernamePassword.Split(':');
if (await IsAuthorized(usernamePassword[0], usernamePassword[1]))
{
await _next(context);
return;
}
}
context.Response.Headers["WWW-Authenticate"] = $"Basic realm=\"{_realm}\"";
context.Response.StatusCode = StatusCodes.Status401Unauthorized;
return;
}
await _next(context);
}
private async Task<bool> IsAuthorized(string username, string password)
{
// 在这里验证用户名和密码
return AppCommon.Config.Admin.Account == username
&& AppCommon.Config.Admin.Password == password;
}
}
}