У меня есть веб-API, написанный на ядре .net, и приложение angular, которое обращается к методам API. Я защитил api с помощью аутентификации JWT, поэтому при первой загрузке приложения оно регистрируется в приложении, чтобы получить токен JWT для доступа к API. Проблема в том, что я хочу заблокировать определенные методы в моем API, чтобы к ним мог получить доступ только SPA, а не третья сторона. Если я включу инструменты разработчика, я увижу, что мое приложение вызывает мой api для получения токена JWT, но что помешает кому-либо еще делать это и иметь полный доступ к моему API?
Я знаю, но как мне остановить кого-то, использующего такое приложение, как postmaster, для отправки сообщений в мой API, такой как AddToBasket, я хочу, чтобы только мой веб-сайт мог вызывать этот метод





Использование токенов JWT позволяет вам ограничить доступ к вашему приложению определенной аудиторией, например, вашим Angular SPA. Для этого, когда вы добавляете аутентификацию в свое основное приложение .net, определите целевую аудиторию в конфигурации аутентификации следующим образом:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = "JwtBearer";
options.DefaultChallengeScheme = "JwtBearer";
})
.AddJwtBearer("JwtBearer", jwtBearerOptions =>
{
jwtBearerOptions.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true, // verify signature to avoid tampering
IssuerSigningKey =
new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(appSettings.Secret)),
ValidateIssuer = true,
ValidIssuer = appSettings.AppIssuer, // site that makes the token
ValidateAudience = true,
ValidAudience = appSettings.AppAudience, // site that consumes the token
ValidateLifetime = true, //validate the expiration
ClockSkew = System.TimeSpan.FromMinutes(0), // tolerance for the expiration date
};
});
Как видите, я храню информацию об аудитории в моем файле app.settings.json. Предполагая, что вы используете свой угловой SPA на http://localhost:4200
Теперь вы можете настроить app.settings следующим образом:
{
"AppSettings": {
"Secret": "secretKey",
"AppIssuer": "http://localhost:5000", //this is address of you web api
"AppAudience": "http://localhost:4200"
}
}
Отныне каждый запрос, исходящий не от http://localhost:4200, будет неавторизованным.
Извините, я до сих пор не понимаю, насколько это безопасно, если вы можете отслеживать вызов из клиентского приложения в api, то что мешает кому-либо вызывать api? Нужен ли спа-центру какой-то ключ, сгенерированный сервером, чтобы гарантировать, что api принимает запросы только от веб-приложения?
Использование токенов JWT позволяет ограничить доступ к вашему приложению с помощью секретного ключа, который известен только вашему веб-API. Он хешируется в токене JWT, который вы создали для потребителя API. Каждый запрос с токеном JWT будет проверяться, если секретный ключ от клиента совпадает с секретом, хранящимся в вашем API.
вот как работает токен jwt, прочтите, чтобы узнать больше: jwt.io/introduction