Как обеспечить аутентификацию JWT Angular + Asp core - PullRequest
0 голосов
/ 26 апреля 2018

Я создал приложение Angular 5 + Asp.Core и добавил аутентификацию JWT в существующую базу данных пользователей

public void ConfigureServices(IServiceCollection services)
        {
.............
 var appSettings = appSettingsSection.Get<UserSettings>();
            var key = Encoding.ASCII.GetBytes(appSettings.Secret);

            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(key),
                    ValidateIssuer = false,
                    ValidateAudience = false,
                    ValidateLifetime = true,
                    ClockSkew = TimeSpan.Zero
                };
            });
}

контроллер входа в систему:

    public class LoginController : Controller
        {
            private readonly Entities db;
            private readonly UserSettings appSettings;

            public LoginController(Entities _db, IOptionsSnapshot<UserSettings> _appSettings)
            {
                db = _db;
                appSettings = _appSettings.Value;

            }

            [Route("/api/login")]
            [HttpPost]
            public IActionResult Login([FromBody] LoginData logindata)
            {
                var user = db.HT_USERS
                  .SingleOrDefault(u => u.USERNAME == logindata.Username && 
DecryptString128Bit(u.PASSW, "passwkey") == logindata.Password);
                if (user == null)
                {
                    return NotFound();
                }
                else
                {

                    var tokenHandler = new JwtSecurityTokenHandler();
                    var key = Encoding.ASCII.GetBytes(appSettings.Secret);
                    var tokenDescriptor = new SecurityTokenDescriptor
                    {
                        Subject = new ClaimsIdentity(new Claim[]
                        {
                          new Claim(ClaimTypes.NameIdentifier , user.ID.ToString())
                        }),
                        Expires = DateTime.UtcNow.AddDays(7),
                        SigningCredentials = new SigningCredentials(
                        new SymmetricSecurityKey(key),
                        SecurityAlgorithms.HmacSha256Signature)
                    };


                    var token = tokenHandler.CreateToken(tokenDescriptor);
                    var tokenString = tokenHandler.WriteToken(token);

                    return Ok(new
                    {
                        username = user.NAME,
                        token = tokenString
                    });

                }
            }
        }   

Из Angular я получаю токен от контроллера входа и сохраняю его в localStorage

внутри Angular Я получаю статус входа в систему, например:

isLoggedIn() {
        if (localStorage.getItem(this.tokenName)) {
            return true;
        }
        return false;
    }

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

Как насчет приведенного выше кода, он достаточно защищен, чтобы использовать его в производстве? спасибо

...