Аутентификация ядра ASP.NET: токен носителя для действия и аутентификация Windows для другого в том же контроллере - PullRequest
0 голосов
/ 25 сентября 2019

То, что я хочу сделать, это предложить в моем API различные виды конечных точек, к которым можно получить доступ с помощью аутентификации Windows или JWT Bearer.

В Startup.cs ->Сконфигурируйте , аутентификация настроена так, чтобы позволить аутентификацию на предъявителя с требуемыми параметрами:

// Add JWT Bearer
services.AddAuthentication(x =>
{
    x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x =>
{
    x.RequireHttpsMetadata = false;
    x.SaveToken = true;
    x.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(tokenManagement.Secret)),
        ValidIssuer = tokenManagement.Issuer,
        ValidateIssuer = true,
        ValidateLifetime = true,
        ValidateAudience = false,
        ClockSkew = TimeSpan.FromSeconds(tokenManagement.ClockSkewSeconds)
    };
});

И для защиты моих конечных точек я пробовал что-то вроде этого:

// THIS WAY I CAN LIMIT TO WINDOWS CREDENTIAL
[Authorize]
[HttpGet("[action]")]
public IActionResult AuthorizeWindowsUser()
{
    var user = HttpContext.User;
    if (user.GetType() == typeof(System.Security.Principal.WindowsPrincipal))
    {
        return Ok();
    }
    return Unauthorized();
}

// THIS WAY I CAN LIMIT TO JWT
[Authorize]
[HttpGet("[action]")]
public IActionResult AuthorizeLoginUser()
{
    var user = HttpContext.User;
    if (user.GetType() == typeof(System.Security.Claims.ClaimsPrincipal))
    {
        return Ok();
    }
    return Unauthorized();
}

Это работает, но мои вопросы будут такими:

  • Это что-то, что кажется логичным?Моя цель - защитить конечные точки, которые доставляют токен пользователя.Одна конечная точка будет защищена токеном JWT (токен обновления) и определенной ролью, другая будет защищена учетными данными Windows.
  • Я что-то упустил?Когда я использовал только проверку подлинности Windows, я использовал для установки services.AddAuthentication (IISDefaults.AuthenticationScheme); в моих Startup.cs -> Configure кажется, чтоЕсли нет необходимости работать в описанной реализации выше, но я действительно не знаю, что делает эта строка, и если это необходимо или нет (кстати, нет).
  • Есть ли более умный / красивый способ проверить тип пользователя?Может быть, что-то вроде пользовательских атрибутов

Спасибо за советы!

1 Ответ

0 голосов
/ 26 сентября 2019

кажется, что если нет необходимости работать

Это потому, что WebHost.CreateDefaultBuilder(args) делает это за вас.Метод вызовет .UseIISIntegration(); и добавит связанные сервисы за кулисы.Для получения дополнительной информации см. Исходный код вызова UseIISIntegration () и Источник метода UseIISIntegration () .

Существует ли более умный / более красивый способ проверкитип пользователя?Может быть, что-то вроде пользовательских атрибутов

Вам не нужно проверять if( user.GetType() == typeof(System.Security.Principal.WindowsPrincipal) {return ok;} return Unauthorized() вручную в методе действия.Вместо этого используйте встроенный AuthorizeAttribute:

<b>[Authorize(AuthenticationSchemes = "Windows")]</b>
[HttpGet("[action]")]
public IActionResult AuthorizeWindowsUser()
{
<strike>    var user = HttpContext.User;
    if (user.GetType() == typeof(System.Security.Principal.WindowsPrincipal))
    {
        return Ok();
    }
    return Unauthorized();</strike>
    return Ok();   // only users who are <b>authorized with the Windows scheme</b> can access this method
}

То же самое касается Jwt Bearer.Поскольку вы настроили JwtBearerDefaults.AuthenticationScheme в качестве схемы аутентификации по умолчанию , вы можете опустить параметр AuthenticationSchemes при использовании аннотации атрибута [Authorize()]:

<b>[Authorize]</b>
[HttpGet("[action]")]
public IActionResult AuthorizeLoginUser()
{
<strike>    var user = HttpContext.User;
    if (user.GetType() == typeof(System.Security.Claims.ClaimsPrincipal))
    {
        return Ok();
    }
    return Unauthorized();</strike>
    return Ok();   // only users who are <b>authorized with the default scheme</b> can access this method
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...