#c# #.net #asp.net-web-api #google-cloud-platform
#c# #.net #asp.net-web-api #google-облачная платформа
Вопрос:
В настоящее время я создаю веб-API с использованием .NET. В настоящее время я тестирую его на insomnia и postman, и моя проблема:
Если я сделаю запрос, скажем что-то вроде HTTP://1.2.3.4:5000/controller это работает как заклинание. Но теперь я пытаюсь получить доступ через домен, например http://api.mydomain.com/controller .
Поддомен перенаправляет на IP-адрес виртуальной машины Google Cloud, на которой установлен API (http://sub.dom.com => http://1.2.3.4:5000 )
[Authorize]
[ApiController]
[Route("[controller]")]
public class UserController : ControllerBase
{
private readonly IUserRepo _userRepo;
public UserController(IUserRepo userRepo)
{
Console.WriteLine("TEST2");
_userRepo = userRepo;
}
[HttpGet]
public List<User> GetAll()
{
return _userRepo.Get();
}
Это работает только тогда, когда я комментирую или удаляю [Authorize]
часть. Если я добавлю что-то вроде [AllowAnonymous]
поверх [HttpGet]
, это не сработает.
В настоящее время я использую токен-носитель JWT для разрешения доступа и работает, когда я получаю доступ с IP-адреса, как я уже сказал.
Кто-нибудь может мне помочь или указать на документацию, чтобы это произошло?
Это мой startup.cs
namespace sinba_backend
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddControllers();
var appSettingsSection = Configuration.GetSection(nameof(ConnSettings));
services.Configure<ConnSettings>(appSettingsSection);
services.AddSingleton<IConnSettings>(serviceProvider =>
serviceProvider.GetRequiredService<IOptions<ConnSettings>>().Value);
var appSettings = appSettingsSection.Get<ConnSettings>();
var key = Encoding.ASCII.GetBytes(appSettings.SecretCredentials);
services.AddAuthentication(authOptions =>
{
authOptions.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
authOptions.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(jsonWebToken =>
{
jsonWebToken.RequireHttpsMetadata = false;
jsonWebToken.SaveToken = true;
jsonWebToken.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false,
};
});
services.AddScoped<IUserRepo,UserRepo>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseCors(policy =>
policy.AllowAnyOrigin().
AllowAnyHeader().
AllowAnyMethod()
);
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
Возможно, это что-то связанное с сетью, но я так не думаю, поскольку у меня есть доступ, когда я удаляю [Authorize]
часть.
Спасибо.
Редактировать:
Просто чтобы указать, что у меня есть http://api.mydomain.com/auth , если учетные данные верны, он отправляет мне токен обратно, затем я использую этот токен для всех операций, но это работает только тогда, когда я получаю доступ через IP-адрес, когда я использую домен 404 Not Found
, который он мне отправляет, или Unauthorized
даже к анонимным маршрутам, когда я удаляючасть [Authorize]
, в которой анонимные маршруты начинают работать
Как я уже говорил ранее, если я использую свой браузер и помещаю http://api.mydomain.com / он перенаправляет на http://1.2.3.4:5000 /
Комментарии:
1. Просто для пояснения, вы на самом деле используете какое-то HTTP «перенаправление» на IP-адрес или используете DNS CNAME?
2. @BryanLewis Я использую DNS-домен, друг одолжил мне свой, и я решил попробовать. Я пробовал видимое перенаправление, при котором домен меняется на IP-адрес назначения, и я также пробовал невидимое перенаправление, при котором имя домена остается. Мой провайдер ovh.com
Ответ №1:
Если вы используете авторизацию, вам необходимо передать токен в веб-api. Поскольку ваш вызов работает, когда вы закомментируете [Авторизовать], похоже, что вы:
- Не передают токен контроллеру или
- ваш токен из вашего локального домена.
Ваше решение должно заключаться в вызове вашей процедуры входа в систему на http://api.mydomain.com/login , получите жетон и используйте этот жетон в своем вызове почтальона, чтобы http://api.mydomain.com/controller .
Комментарии:
1. Привет, это именно моя проблема, с которой я столкнулся api.mydomain.com/auth , если учетные данные верны, он отправляет мне токен обратно, затем я использую этот токен для всех операций, но это работает только тогда, когда я получаю доступ через IP-адрес, когда я использую домен, который отправляет мне не найденный или несанкционированный, даже анонимныймаршруты, когда я удаляю часть авторизации, анонимные маршруты начинают работать
2. Возможно, ваша маршрутизация настроена неправильно? Добавьте [RoutePrefix(«/ User»)] прямо над объявлением класса UserController, а затем поместите [Route(«GetAll»)] над функцией GetAll() . Удалите [Route(«[controller]»)] из вышеуказанного класса UserController. Тогда вы должны иметь возможность вызывать следующим образом: api.mydomain.com/user/getall
3. Это не сработало, но я начинаю думать, что эта проблема выходит далеко за рамки . СЕТЕВОЙ код Это может быть что-то связанное с сетью. Я пойду, чтобы прочитать некоторую документацию о том, как работают перенаправления и DNS, возможно, я что-то упускаю. Спасибо.
Ответ №2:
Выполнено. Проблема заключалась в том, что когда я перенаправлял URL-адрес назначения, он не получал отправленные заголовки, поэтому Authorization: Bearer token
никогда не доходил до конечной точки.
Чтобы решить эту проблему, мне пришлось настроить зону DNS в моем проекте Google Cloud, где была выделена виртуальная машина, домен был api.mydomain.com , а затем он выдаст вам URL-адреса их DNS-серверов NS.
После этого я просто добавляю URL-адреса этих DNS-серверов в область конфигурации домена, указываю новое перенаправление на мой внешний IP-адрес виртуальной машины, и вот оно, все заголовки правильно достигают адресата, поскольку они отправляются непосредственно на ваш хост.