Как совместить проверку подлинности Windows и JWT с .Net Core 2.1 - PullRequest
0 голосов
/ 03 сентября 2018

Я пытался использовать проверку подлинности Windows и JWT вместе с .NET Core 2.1.

У меня есть следующие параметры запуска аутентификации:

services.AddAuthentication(options =>
                {
                    options.DefaultAuthenticateScheme = IISDefaults.AuthenticationScheme;
                    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
                })
                .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,

                    ValidIssuer = "Test",
                    ValidAudience = "Test",
                    IssuerSigningKey = JwtSecurityKey.Create("677efa87-aa4d-42d6-adc8-9f866e5f75f7")
                };

                options.Events = new JwtBearerEvents()
                {
                    OnAuthenticationFailed = OnAuthenticationFailed
                };
            });

Настройки IIS:

"iisSettings": {
    "windowsAuthentication": true, 
    "anonymousAuthentication": true, 
    ..
  }

Я попробовал следующий фрагмент кода для создания токена JWT с аутентификацией Windows:

[Route("api/[controller]")]
    [ApiController]
    [Authorize(AuthenticationSchemes = "Windows")]
    public class AuthController : ControllerBase
    {
        [HttpPost("token")]
        public IActionResult Token()
        {
            //Setup claims
            var claims = new[]
            {
                new Claim(ClaimTypes.Name, User.Identity.Name),
                //Add additional claims
            };

            //Read signing symmetric key
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("677efa87-aa4d-42d6-adc8-9f866e5f75f7"));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

            //Create a token
            var token = new JwtSecurityToken(
                issuer: "Test",
                audience: "Test",
                claims: claims,
                expires: DateTime.Now.AddMinutes(30),
                signingCredentials: creds);

            //Return signed JWT token
            return Ok(new
            {
                token = new JwtSecurityTokenHandler().WriteToken(token)
            });
        }
    }

А в другом контроллере мне нужно использовать только аутентификацию JWT:

[Route("api/[controller]")]
    [ApiController]
    [Authorize(AuthenticationSchemes = "Bearer")]
    public class ProductController : ControllerBase
    {
        [HttpGet]
        public IActionResult Get()
        {
            var userName = User.Identity.Name;

            var claims = User.Claims.Select(x => new { x.Type, x.Value });

            return Ok(new { userName, claims });
        }
    }

Если срок действия токена JWT истек, я правильно получил код ответа 401, но в браузере все равно отображается диалоговое окно для ввода учетных данных.

Как настроить аутентификацию Windows только для части, когда я хочу создать токен JWT и отключить ответ, который отвечает за отображение диалога браузера с учетными данными? Как правильно сочетать эти вещи?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Я бы справился с этим, создав два разных веб-приложения: одно для аутентификации Windows, а другое - для аутентификации токена JWT.

Веб-приложение для проверки подлинности Windows будет очень маленьким и выполняет только одну функцию. Аутентифицируйте пользователя с помощью аутентификации Windows в конечной точке и верните токен JWT.

Затем этот токен можно использовать для основного приложения. Если ваш ключ подписи и аудитория совпадают, не имеет значения, создан ли токен в другом веб-приложении.

Вам не нужно будет пытаться справиться с обоими одновременно.

0 голосов
/ 07 сентября 2018

Этот ответ может помочь: https://stackoverflow.com/a/51055082/1212994

Вы должны убедиться, что вы НЕ устанавливаете HTTP-заголовок Authorization: Bearer при попытке использовать Windows Auth. Ключевым моментом здесь является то, как на самом деле работает Windows Auth. Давайте посмотрим, как это работает с браузером, например.

...