using Microsoft.AspNetCore.Http; using System; using System.Linq; using System.Net.Http.Headers; using System.Text; using System.Threading.Tasks; namespace Kean.Infrastructure.Orleans { /// /// 授权中间件 /// public sealed class AuthorizationMiddleware { private const string USERNAME = "orleans"; private const string PASSWORD = "orleans"; private readonly RequestDelegate _next; /// /// 初始化 Kean.Infrastructure.Orleans.AuthenticationMiddleware 类的新实例 /// public AuthorizationMiddleware(RequestDelegate next) { _next = next; } /// /// 执行方法 /// public Task Invoke(HttpContext httpContext) { var authorization = httpContext.Request.Headers["Authorization"]; if (string.IsNullOrWhiteSpace(authorization)) { return Challenge(httpContext); } var values = AuthenticationHeaderValue.Parse(authorization); if (!"Basic".Equals(values.Scheme, StringComparison.InvariantCultureIgnoreCase)) { return Challenge(httpContext); } var parameters = Encoding.UTF8.GetString(Convert.FromBase64String(values.Parameter)).Split(':'); if (parameters.Length < 2 || parameters[0] != USERNAME || parameters[1] != PASSWORD) { return Challenge(httpContext); } return _next(httpContext); } /* * 授权失败 */ private Task Challenge(HttpContext httpContext) { httpContext.Response.StatusCode = StatusCodes.Status401Unauthorized; httpContext.Response.Headers.Append("WWW-Authenticate", "Basic realm=\"Orleans Dashboard\""); return Task.CompletedTask; } } }