У меня есть приложение 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, я не уверен, что это проблема маршрутизации или, возможно, неправильная конфигурация регистрации приложения. Мне нужна помощь, пожалуйста.