Как получить доступ к моему веб-api через поддомен

#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. Поскольку ваш вызов работает, когда вы закомментируете [Авторизовать], похоже, что вы:

  1. Не передают токен контроллеру или
  2. ваш токен из вашего локального домена.

Ваше решение должно заключаться в вызове вашей процедуры входа в систему на 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-адрес виртуальной машины, и вот оно, все заголовки правильно достигают адресата, поскольку они отправляются непосредственно на ваш хост.