Разрешить использование API внешними приложениями - PullRequest
0 голосов
/ 23 октября 2019

У меня есть приложение Angular 8 + Asp.Core и добавлена ​​аутентификация JWT в существующей базе данных пользователей. Я хочу использовать один контроллер Api для внешнего доступа (сайт PHP), но не для всех контроллеров. Как создать второй токен и предоставить ему доступ только для одного контроллера?

Простое решение - отправить ключ безопасности с данными запроса и проверить, существует ли этот ключ в базе данных, но я не знаю, какбезопасный это

мой текущий код:

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
                };
            });
}


[Authorize]
        public class OtherController : Controller
        {....

контроллер входа:

  [AllowAnonymous]
         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
                            });

                        }
                    }
                }
...