Использование Net Core Identity для защиты приложения Angular 2

#angular #.net-core

#angular #.net-core

Вопрос:

Я не эксперт по безопасности, и я только начинаю с .net core identity, поэтому у меня были некоторые опасения по поводу того, как я в настоящее время планирую объединить приложения .netcore / angular 2. Я хотел использовать шаблоны веб-решений .net core для отдельных учетных записей пользователей для обработки потока авторизации для моего приложения, написанного на Angular 2. (В стороне: моему клиенту нужен сервер .net core и интерфейс angular 2 в одном домене (без CORS), поэтому решение такое).

Способ настройки по умолчанию работает нормально. Как только пользователь входит в систему, я возвращаю частичное представление, содержащее сценарии для моего приложения angular 2 и тег app для инициализации приложения. Мое приложение загружается нормально, и пользователь не может получить к нему доступ, если они еще не прошли проверку подлинности (если, конечно, они каким-либо образом не обходят безопасность .net core identity security). Это также позволяет мне применять .net security к представлениям шаблонов, которые запрашиваются с сервера (частичная визуализация представления).

Мои вопросы

1) Можете ли вы легко настроить .net core Identity для использования токенов jwt, чтобы http-запросы моего приложения Angular 2 могли использовать авторизацию на предъявителя? Это вызывает беспокойство, потому что, если они когда-нибудь пойдут по пути, требующему CORS, тогда мне пришлось бы перенастроить мою аутентификацию .net core на какой-то токен-носитель, который мое приложение angular 2 может использовать для получения токена и отправки его соответствующим образом. Я не уверен, можно ли легко настроить использование .net core identity для возврата токена jwt (если это возможно, пожалуйста, дайте мне знать).

2) Я этого еще не делал, но можно ли настроить http-службу Angular2 для выполнения аутентифицированных запросов (в том же домене), которые могут правильно генерировать ClaimsPrincipal на сервере, используя идентификатор .net core для обеспечения безопасности?

В идеале я хотел бы настроить .net core identity, чтобы я мог по-прежнему использовать шаблон отдельных учетных записей пользователей, а также заранее планировать реализацию CORS, используя .net core Identity для использования токенов-носителей jwt.

Заранее спасибо за любую помощь.

Ответ №1:

Я только что настроил свой Vue.js приложение для использования как JWT, так и авторизации файлов cookie с помощью нашего .Net Core 2.1 API.

добавить в appsettings.json:

 "Tokens": {
    "JwtKey": "0123456789ABCDEF",  //this sample key is insecure, change it
    "JwtIssuer": "http://yourdomain.com",
    "JwtExpireDays": "100"
},
  

Добавить в автозагрузку:

 using System.IdentityModel.Tokens.Jwt;
  

Добавьте это в свой метод startup.cs ConfigureServices:

 // ===== Add Jwt Authentication ========
        JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); // => remove default claims
        services
            .AddAuthentication(options =>
            {
                //  options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                //   options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
                //  options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

            })
            .AddCookie(cfg => cfg.SlidingExpiration = true)
            .AddJwtBearer(cfg =>
            {
                cfg.RequireHttpsMetadata = false;
                cfg.SaveToken = true;
                cfg.TokenValidationParameters = new TokenValidationParameters
                {
                    NameClaimType = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier",
                    ValidIssuer = Configuration["Tokens:Issuer"],
                    ValidAudience = Configuration["Tokens:Issuer"],
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"])),
                    ClockSkew = TimeSpan.Zero // remove delay of token when expire
                };
            });
  

Если вы хотите, чтобы JWT был вашей схемой по умолчанию, раскомментируйте соответствующие строки выше

Чтобы создать токен JWT (при входе в систему или запросе токена), вы можете выполнить следующие действия:

 private object GenerateJwtToken(string email, IdentityUser user)
    {
        var claims = new List<Claim>
        {
            new Claim(JwtRegisteredClaimNames.Sub, email),
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
            new Claim(ClaimTypes.NameIdentifier, user.Id)
        };

        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Tokens:JwtKey"]));
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
        var expires = DateTime.Now.AddDays(Convert.ToDouble(_configuration["Tokens:JwtExpireDays"]));

        var token = new JwtSecurityToken(
            _configuration["Tokens:JwtIssuer"],
            _configuration["Tokens:JwtIssuer"],
            claims,
            expires: expires,
            signingCredentials: creds
        );

        return new JwtSecurityTokenHandler().WriteToken(token);
    }
  

и назовите это как:

 // Identity User (application user)  
            var appUser = _userManager.Users.SingleOrDefault(r => r.Email == model.Email);
            return Ok(GenerateJwtToken(model.Email, appUser));
  

Украсьте свои методы / контроллеры действий API следующим образом:

 [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
  

Ответ №2:

Вы можете проверить JWT в своем основном проекте с помощью IdentityServer4. Добавьте IdentityServer4.Проверка доступа к вашему project.json (устарел) или к вашему .csproj (новый). Затем вы можете использовать промежуточное программное обеспечение IdentityServer4, введя свой автозагрузку.Настройка:

 app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
        {
            Authority = IssuerURL,
            // AllowedScopes = { "MyApp" },
            ScopeName= "MyApp"
        });
  

ScopeName — более старая версия, более новая — AllowedScopes .

Это для проверки токенов.

Для генерации токенов см. Документацию IdentityServer4.

Я не могу помочь в Angular.