Почему проверка подлинности Azure Active Directory вызывает ошибку кодировки символов в моем базовом приложении ASP.NET? - PullRequest
1 голос
/ 11 июля 2019

У меня есть приложение ASP.NET Core 2.2, которое я делаю и которое использует KendoUI как часть своей инфраструктуры. Недавно я настроил кости своего приложения, а затем, используя встроенный мастер Visual Studio 2019, добавил аутентификацию Azure Active Directory. Это создало для меня регистрацию приложения в Azure, которое позволило бы аутентифицировать пользователей по активному каталогу моей компании.

Проблема в том, что когда я сейчас запускаю свое приложение, я получаю следующую ошибку, и страница не загружается:

Кодировка символов в текстовом документе не была объявлена. Документ будет отображаться с искаженным текстом в некотором браузере конфигурации, если документ содержит символы извне Диапазон США-ASCII. Кодировка символов файла должна быть объявленный в протоколе передачи или файл должен использовать порядок байтов пометить в качестве подписи кодировки.

Дальнейшее изучение этого сообщения показывает более подробную информацию:

Ошибка загрузки этого URI: ошибка протокола (unknownError): не удалось загрузить источник для https://localhost:44379/. [Exception ... »Компонент возвращенный код ошибки: 0x80470002 (NS_BASE_STREAM_CLOSED) [nsIInputStream.available] "nsresult:" 0x80470002 (NS_BASE_STREAM_CLOSED) "местоположение:" кадр JS :: ресурс: //devtools/shared/DevToolsUtils.js :: onResponse :: line 555 " данные: нет] Стек: onResponse @ ресурсы: //devtools/shared/DevToolsUtils.js: 555: 34 onStopRequest @ resource: //gre/modules/NetUtil.jsm: 123: 17 Строка: 555, столбец: 0

Я посмотрел на все, что было затронуто при добавлении AAD, и следующие файлы в моем проекте были изменены.

  • appSettings.json
  • Startup.cs
  • Расширения (папка)
  • [Authorise] помещено в HomeController.cs
  • AzureAD (папка)

Используя AAD ранее в своих приложениях, я ожидаю увидеть изменения этих файлов, но у меня никогда не было проблем с запуском приложения. Я начал исследовать, какие возможные изменения могут быть причиной проблемы. После некоторой работы я понимаю, что, если я удаляю [Authorize] из моего контроллера, все загружается нормально.

Полагаю, это потенциальная проблема с маршрутизацией при регистрации моего приложения? Я не уверен, мне нужна некоторая помощь, поскольку сообщение представляет собой нечто вроде красной сельди, поскольку оно предполагает наличие проблемы с форматированием HTML. Мне нужно некоторое руководство относительно того, что происходит не так.

Вот мой код и структура проекта.

Структура

Я всегда отделяю свой пользовательский интерфейс от библиотек классов, поскольку AAD не изменяет файлы в библиотеках Data, Repo или Services, для краткости я не буду включать их в этот вопрос.

  • MyCompany.Data
  • MyCompany.Repo
  • MyCompany.Services
  • MyCompany.UI

MyCompany.UI / Контроллеры / HomeController.cs

using MyCompany.Data;
using Kendo.Mvc.UI;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
using MyCompany.Services;
using Kendo.Mvc.Extensions;
using Microsoft.AspNetCore.Authorization;

namespace MyCompany.Controllers
{
    [Authorize]
    public class HomeController : Controller
    {
        private readonly IVesselService _service;

        public HomeController(IVesselService vesselService)
        {
            _service = vesselService;
        }
        public IActionResult Index()
        {
            return View();
        }
        public IActionResult Privacy()
        {
            return View();
        }
        public ActionResult ReadVessels([DataSourceRequest]DataSourceRequest request)
        {
            var vessel = _service.GetVessels();
            return Json(vessel.ToDataSourceResult(request));
        }
        [AcceptVerbs("Post")]
        public ActionResult CreateVessel([DataSourceRequest] DataSourceRequest request, Vessel vessel)
        {
            if (vessel != null && ModelState.IsValid)
            {
                _service.InsertVessel(vessel);
            }

            return Json(new[] { vessel }.ToDataSourceResult(request, ModelState));
        }
        [AcceptVerbs("Post")]
        public ActionResult UpdateVessel([DataSourceRequest] DataSourceRequest request, Vessel vessel)
        {
            if (vessel != null && ModelState.IsValid)
            {
                _service.UpdateVessel(vessel);
            }

            return Json(new[] { vessel }.ToDataSourceResult(request, ModelState));
        }
        [AcceptVerbs("Post")]
        public ActionResult DestroyVessel([DataSourceRequest] DataSourceRequest request, Vessel vessel)
        {
            if (vessel != null)
            {
                _service.DeleteVessel(vessel.Id);
            }

            return Json(new[] { vessel }.ToDataSourceResult(request, ModelState));
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}

MyCompany.UI / Startup.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Serialization;
using MyCompany.Repo;
using Microsoft.EntityFrameworkCore;
using MyCompany.Services;

namespace MyCompany
{
    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.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
               // Maintain property names during serialization. See:
               // https://github.com/aspnet/Announcements/issues/194
               .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());

            // Database Context
            services.AddDbContext<MyCompanyContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("MyCompanyConnection"), b => b.MigrationsAssembly("MyCompany.Repo")));

            //Repository Scope
            services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
            services.AddTransient<IVesselService, VesselService>();

            //Azure AD Authentication
            services.AddAuthentication(sharedOptions =>
            {
                sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddAzureAdBearer(options => Configuration.Bind("AzureAd", options));

            //Add KendoUI Services to services container
            services.AddKendo();

            services.AddMvc();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseCookiePolicy();
            app.UseStaticFiles();
            app.UseAuthentication();
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}

MyCompany / appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "ConnectionStrings": {
    "MyCompanyConnection": "Server=tcp:mydatabase.database.windows.net,0000;Initial Catalog=MyDatabase;Persist Security Info=False;User ID=Cloud;Password=Midgar1997!;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
  },
  "AllowedHosts": "*",
  "AzureAd": {
    "ClientId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "Domain": "mycompany.onmicrosoft.com",
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "xxxxxxxx",
    "CallbackPath": "/signin-oidc",
    "ClientSecret": "xxxxxx",
    "AppIDURL": "https://mycompany.onmicrosoft.com/MyCompany.UI",
    "ConfigView": "MVC"
  }
}

Итак, это код, который напрямую связан с AAD, я не уверен, что это проблема маршрутизации или, возможно, неправильная конфигурация регистрации приложения. Мне нужна помощь, пожалуйста.

1 Ответ

0 голосов
/ 16 июля 2019

Если вы можете воспроизвести это, я могу сообщить об этом как об ошибке продукта команде AAD. Иногда эта ошибка возникает, если вы обращаетесь к другому сервису (например, Azure SQL), и существует проблема с соединением. У вас есть еще журналы ошибок?

Если вы хотите получить билет в службу поддержки, не стесняйтесь обращаться ко мне по адресу AzCommunity@microsoft.com, и я могу открыть для вас дело.

...