Asp. Net Перенаправление «Регистрация» и «Вход» в базовом шаблоне не работает в Azure AppService - PullRequest
0 голосов
/ 19 июня 2020

Asp. Net Приложение Core 3.0. Я использую индивидуальную аутентификацию Entity Framework Identity и использую шаблоны на странице входа и странице регистрации. У меня есть база данных SQL в Azure.

Когда я запускаю на localhost, регистрация и вход в систему работают нормально. Я подтвердил, что новый пользователь сохранен в таблице «Пользователи БД».

Но когда я развертываю Azure AppService, я получаю сообщение об ошибке 404 page not found, когда я нажимаю кнопку регистрации или входа.

Я пробовал:

  • Масштабирование до платного плана и реализация CNAME Используя GoDaddy и Azure для моей службы приложений, чтобы удалить .azurewebsites.net из URL-адреса

  • Добавлены asp-area и asp-page в элементы <button> в моем CS html.

  • Включено Azure Аутентификация и авторизация в службе приложений и добавлено http://www.myapp.com в качестве URL-адреса перенаправления.

  • Добавлены в белый список все мои исходящие IP-адреса AppService в настройках брандмауэра Azure сервера БД.

  • Я попытался использовать консоль разработчика в Chrome, чтобы увидеть, что происходит, но не нашел ничего полезного.

  • Вытащил несколько волос. ..

Есть идеи, где мне искать?

Дополнительная информация:

appsetti ngs. json

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=tcp:**-*****.database.windows.net,1433;Initial Catalog=****;Persist Security Info=False;User ID=****;Password=****;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"

DbContext:

using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;

namespace MyApp.Data
{
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
        {
        }
    }
}

Регистр cs html:

<button type="submit" class="btn btn-primary" asp-area="Identity" asp-page="Register" id="RegisterButton">@_loc[Model.RegisterButtonName]</button>

Войти cs html:

<div class="form-group">
<button type="submit" class="btn btn-primary" asp-area="Identity" asp-page="Login" id="LoginButton">@_loc[Model.LoginButtonName]</button>
</div>

Ошибка: если я перейду к https://www.myapp.com/en/Identity/Account/Login со своей домашней страницы, страница загрузится нормально. Но когда я нажимаю кнопку «Войти / Зарегистрироваться», перенаправление не выполняется и показывает ошибку ниже.

Скриншот ошибки

Промежуточное ПО:

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseRequestLocalization();
    
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
    name: "default", pattern: " 
    {culture=en}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
    name: "Features", pattern: " 
    {culture=en}/{controller=Features}/{action=Features}/{id?}");
endpoints.MapControllerRoute(
    name: "About", pattern: " 
    {culture=en}/{controller=About}/{action=About}/{id?}");
endpoints.MapControllerRoute(
    name: "Help", pattern: " 
    {culture=en}/{controller=Help}/{action=Help}/{id?}");
endpoints.MapRazorPages();
});

База данных:

При щелчке по регистру в БД не создается запись пользователя, только страница с ошибкой

Обновление:

Я искал всю свою кодовую базу для поиска «localhost», но не нашел его нигде, кроме настроек IIS.

Обновление:

Я добавил сервер и виртуальные входящие IP-адреса из nslookup в белый список брандмауэра сервера БД.

Обновление:

В Firefox Я не получаю сообщения об ошибке. Просто пустая белая страница.

На Edge я получаю ту же ошибку 404, что страница не может быть найдена.

Обновление:

В моем запуске .cs. Я пробовал как true, так и false для RequireConfirmedAccount

services.AddDefaultIdentity<ApplicationUser>( options => { options.SignIn.RequireConfirmedAccount = true; }).AddEntityFrameworkStores<ApplicationDbContext>();

Обновление:

Подтверждено, что действие сборки установлено на Содержимое для моего cs html свойства.

Обновление:

Добавлено TXT | asuid | идентификатор проверки приложения в мои настройки DNS в GoDaddy.

Добавлено TXT | @ | mywebsite.azurewebsites. net в мои настройки DNS в GoDaddy.

Добавлен mywebsite.com в качестве назначенного пользовательского домена и подтвержден на портале azure.

Обновление:

Мне сказали на форумах MSDN, что это может быть потому, что HTTP POST для кнопки отправки не работает, и я должен изменить его на привязку <a> тег или Input введите кнопку.

Изменить html можно, но я пытаюсь понять, что это будет значить для кода перенаправления моей страницы Razor? Было бы здорово, если бы кто-нибудь указал мне правильное направление. Существующий код перенаправления для страницы регистрации, показанный ниже.

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl ??= Url.Content("~/");
    ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
    if (ModelState.IsValid)
    {
        var user = new ApplicationUser { UserName = Input.Email, Email = Input.Email };
        var result = await _userManager.CreateAsync(user, Input.Password);
        if (result.Succeeded)
        {
            _logger.LogInformation("User created a new account with password.");

            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
            var callbackUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { area = "Identity", userId = user.Id, code },
                protocol: Request.Scheme);

            await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

            if (_userManager.Options.SignIn.RequireConfirmedAccount)
            {
                return RedirectToPage("RegisterConfirmation", new { email = Input.Email });
            }
            else
            {
                await _signInManager.SignInAsync(user, isPersistent: false);
                return LocalRedirect(returnUrl);
            }
        }
        foreach (var error in result.Errors)
        {
            ModelState.AddModelError(string.Empty, error.Description);
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

Я предполагаю, из небольшого исследования, что мой новый cs html будет примерно таким:

<input id="RegisterButton" runat="server" onserverclick="RegisterButtonClick" type="submit" class="btn btn-primary" asp-area="Identity" asp-page="Register" >@_loc[Model.RegisterButtonName]</input>

Обновление:

Я закомментировал Use.Hsts для prod в методе Configure моего startup.cs

Обновление:

Я пробовал жестко кодировать returnUrl в методе OnPostAsync моего login.cshtml.cs вместо использования returnUrl ??= Url.Content("~/"); Та же ошибка 404 ... поэтому я не уверен, где перенаправление действительно запускается службой идентификации, которая перенаправляет на ту же страницу входа. Очевидно, не в моем OnPostAsyn c, потому что он должен был попытаться достичь URL-адреса, который я жестко запрограммировал, а именно ~/myapp.com/en/Features/Features. Тьфу. Это вызывает у меня серьезные головные боли.

Обновление:

Я попытался заменить return LocalRedirect(returnUrl); на return LocalRedirect(Url.Action("Login", "Identity/Account"));, но он не работает на localhost, поэтому я не пробовал в прод. Он говорит:

No webpage was found for the web address: https://localhost:44305/en/Identity%2FAccount/Login

Обновление:

Я заменил нулевые операторы объединения для returnUrl ??= Url.Content("~/"); оператором = для returnUrl = Url.Content("~/");

Обновление:

Подтверждено, что мои AddControllersWithViews и AddRazorPages do НЕ реализуют глобальную авторизацию по умолчанию, а мои модели страниц входа и регистрации имеют [AllowAnonymous] указано.

Обновление:

Я внес изменения в свой метод OnPostAsync и свой ConfigureServices<IdentityOptions>. Я думаю, что требования к паролю IdentityOptions по умолчанию маскировали истинную проблему. Служба с этим пользователем. Но теперь в AppService я получаю сообщение об ошибке «Недопустимая попытка входа» в пользовательском интерфейсе для этого пользователя, выполняющего предварительную настройку. В консоли нет ошибки.

Так что в основном я все еще не могу зарегистрироваться или войти в AppService, но почему-то через 2 недели сообщение об ошибке в пользовательском интерфейсе, которое я могу попытаться диагностировать, похоже на прогресс!

Я исследую это, потому что это происходит с новыми пользователями, которых я также регистрирую на localhost, так что это все равно нужно решить в первую очередь. Если это не поможет, я рассмотрю CORS как следующую остановку, чтобы найти разрешение AppService. Я тоже, скрестив пальцы, обратился к Microsoft. Спасибо, ребята.

ОБНОВЛЕНИЕ: Теперь проблема решена. Честно говоря, понятия не имею, как. Я внес столько изменений за последние несколько недель, что отменять все свои коммиты один за другим, чтобы выяснить, что это исправлено, было бы слишком болезненно. Когда через несколько недель болезненное воспоминание утихнет, я вернусь и попытаюсь снова его сломать, чтобы узнать, что это было. Тогда выложу обновление.

Ответы [ 2 ]

1 голос
/ 28 июня 2020

Как уже отмечалось в комментарии, это может быть проблема CORS. Я бы посоветовал использовать скрипач и посмотреть запросы, которые ваш браузер отправляет на сервер. Совсем недавно у меня была аналогичная проблема CORS, когда браузер отправлял запрос OPTIONS на сервер до фактического POST. Что сработало для меня, за исключением включения ПО промежуточного слоя CORS и RequireCors на ваших конечных точках, так это добавление атрибута HttpOptions в действиях контроллера.

Удачи!

1 голос
/ 24 июня 2020

Попробуйте создать URL-адреса с помощью @ Url.Action («Вход», «Учетная запись»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...