C# ApiController: несколько методов аутентификацииC#

Место общения программистов C#
Anonymous
C# ApiController: несколько методов аутентификации

Сообщение Anonymous »

У нас есть контроллер веб-API ASP.NET Core 7, и мы используем Azure AD B2C в качестве основной аутентификации, которая работает нормально. Нам нужна одна конечная точка для базовой аутентификации. Я попытался создать собственный обработчик авторизации, который делает это, и он работает нормально. Я вижу, как он работает и выполняет context.Succeed, но я все равно получаю ответ 401 на свой звонок. Это как если бы затем он выполнил проверку Azure AD B2C, которая завершилась неудачей.
Я пробовал поместить атрибут [AllowAnonymous] в конечную точку, а также [Authorize(Policy = " BasicAuth")], но тогда аутентификация не применяется.

Код: Выделить всё

public class BasicAuthHandler : AuthorizationHandler
{
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly AppSettings _settings;

public BasicAuthHandler(IHttpContextAccessor httpContextAccessor, IOptions settings)
{
_httpContextAccessor = httpContextAccessor;
_settings = settings.Value;
}

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, BasicAuthRequirement requirement)
{
if (ValidateBasicAuth(_httpContextAccessor.HttpContext))
{
context.Succeed(requirement);
}
else
{
var response = _httpContextAccessor.HttpContext.Response;
response.Clear();
response.StatusCode = 401;
context.Fail();
}

return Task.CompletedTask;
}

private bool ValidateBasicAuth(HttpContext context)
{
string authHeader = context.Request.Headers["Authorization"];

if (authHeader != null && authHeader.StartsWith("Basic"))
{
string encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim();
Encoding encoding = Encoding.GetEncoding("iso-8859-1");
string usernamePassword = encoding.GetString(Convert.FromBase64String(encodedUsernamePassword));

int seperatorIndex = usernamePassword.IndexOf(':');

var username = usernamePassword.Substring(0, seperatorIndex);
var password = usernamePassword.Substring(seperatorIndex + 1);
if (username.Equals(_settings.BasicAuth.Username, StringComparison.OrdinalIgnoreCase) && password.Equals(_settings.BasicAuth.Password))
return true;
}

return false;
}
}
Как настроить два разных метода аутентификации для разных конечных точек?

Подробнее здесь: https://stackoverflow.com/questions/790 ... on-methods

Вернуться в «C#»