Skip to content

Commit

Permalink
Merge pull request #405 from olizarevichroman/master
Browse files Browse the repository at this point in the history
Refactor BasicAuthMiddleware.cs to use spans and file scoped namespaces.
  • Loading branch information
richorama authored Jul 18, 2023
2 parents 07533df + d0e0c23 commit b035180
Showing 1 changed file with 32 additions and 28 deletions.
60 changes: 32 additions & 28 deletions OrleansDashboard/BasicAuthMiddleware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,43 +3,47 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.Options;
using Microsoft.Net.Http.Headers;

namespace OrleansDashboard
namespace OrleansDashboard;

internal sealed class BasicAuthMiddleware
{
internal class BasicAuthMiddleware
{
private readonly RequestDelegate next;
private readonly DashboardOptions options;
private const string BasicAuthorizationPrefix = "Basic ";
private readonly RequestDelegate next;
private readonly DashboardOptions options;

public BasicAuthMiddleware(RequestDelegate next, IOptions<DashboardOptions> options)
{
this.next = next;
this.options = options.Value;
}
public BasicAuthMiddleware(RequestDelegate next, IOptions<DashboardOptions> options)
{
this.next = next;
this.options = options.Value;
}

public Task Invoke(HttpContext context)
public Task Invoke(HttpContext context)
{
if (context.Request.Headers.TryGetValue(HeaderNames.Authorization, out var authorizationHeader) &&
authorizationHeader[0]!.StartsWith(BasicAuthorizationPrefix, StringComparison.InvariantCulture))
{
if (context.Request.Headers.TryGetValue("Authorization", out var authorizationHeader))
{
var authorizationEncoded = authorizationHeader.ToString().Replace("Basic", string.Empty).Trim();
var authorizationBytes = Convert.FromBase64String(authorizationEncoded);

var decodedString = Encoding.UTF8.GetString(authorizationBytes);
var authorizationEncoded = authorizationHeader[0][BasicAuthorizationPrefix.Length..].Trim();
var authorizationBytes = Convert.FromBase64String(authorizationEncoded);

var parts = decodedString.Split(':');
var decodedSpan = Encoding.UTF8.GetString(authorizationBytes).AsSpan();
var separatorIndex = decodedSpan.IndexOf(":");

if (parts.Length == 2 && parts[0] == options.Username && parts[1] == options.Password)
{
return next(context);
}
if (separatorIndex > 0 &&
decodedSpan[..separatorIndex].SequenceEqual(options.Username) &&
decodedSpan[(separatorIndex + 1)..].SequenceEqual(options.Password))
{
return next(context);
}
}

context.Response.StatusCode = StatusCodes.Status401Unauthorized;
context.Response.HttpContext.Features.Get<IHttpResponseFeature>().ReasonPhrase = "Unauthorized";
context.Response.Headers.Add("WWW-Authenticate", new[] { "Basic realm=\"OrleansDashboard\"" });
context.Response.StatusCode = StatusCodes.Status401Unauthorized;
context.Response.HttpContext.Features.Get<IHttpResponseFeature>().ReasonPhrase = ReasonPhrases.GetReasonPhrase(context.Response.StatusCode);
context.Response.Headers.Add(HeaderNames.WWWAuthenticate, new[] { "Basic realm=\"OrleansDashboard\"" });

return Task.CompletedTask;
}
return Task.CompletedTask;
}
}
}

0 comments on commit b035180

Please sign in to comment.