Пользовательский AuthorizeAttribute — конечная точка не работает

Я новичок в Asp.net Core, надеюсь, кто-нибудь поможет найти проблему. Я создал пользовательский Authorize Attribute для проверки данных входа в систему, хранящихся в appsettings.json Работа Authorize Attribute (точки останова достигнуты, данные верны). Но после проверки запрошенная конечная точка так и не попала.

Я проверил, работает ли конечная точка без authorization. И да, это работа.

В Startup.cs я загружаю свои логины из appsettings.json и добавляю их в сервис как singleton.

LoginModel[] logins = Configuration.GetSection("LoginUsers").Get<LoginModel[]>();
Settings setting = new Settings();
setting.LoginModels = logins;
services.AddSingleton(setting);

Мой атрибут авторизации:


[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class MyAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{

    public MyAuthorizeAttribute()
    {
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        // get username and password from header
        string authHeader = context.HttpContext.Request.Headers["Authorization"];
        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);

        var services = context.HttpContext.RequestServices;
        var settings = services.GetService<Settings>();

        var loginfound = settings.LoginModels.Where(x => x.Username == username && x.Password == password).FirstOrDefault();


        if (loginfound == null)
        {
            context.Result = new StatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
        }
    }
}

Мой контроллер:

[Route("api/[controller]")]
[ApiController]
[MyAuthorize]
public class SettingsController : ControllerBase
{

    [HttpGet("checkLogin")]
    public IActionResult CheckLogin()
    {

        return Ok(true);
    }
}

Моя конечная точка больше не работает. Что я делаю не так? у меня нет ни одной ошибки.


person andreas    schedule 11.09.2019    source источник


Ответы (1)


Для использования собственной логики авторизации с IAuthorizationFilter не следует использовать с AuthorizeAttribute, который будет проверять аутентификацию с помощью схемы аутентификации по умолчанию.

Ссылка на ответ Тао Чжоу здесь: Asp.Net Core 2.1 – Авторизация на основе контента в запросе

person Stephen McDowell    schedule 11.09.2019