Проблема, которая будет описана, заключается в том, что приложение предназначено для аутентификации другого приложения, и страница входа не проходит аутентификацию, после чего вводятся правильные учетные данные.
Конечные точки в нескольких приложениях защищены [Авторизация], чтобы гарантировать выполнение вызова и отображение страницы входа в систему.В целях тестирования используются новые приложения Net Core с функциональностью по умолчанию.Одно приложение запускается на локальном хосте, а другое приложение запускается и входит в систему, чтобы перенаправить на первое сразу после успешной аутентификации, отображая страницу входа в систему для этого приложения.Это нормально.
Если учетные данные для входа введены неверно, то «Неверная попытка входа», как и следовало ожидать.Однако, когда применяются правильные учетные данные, проверка подлинности вообще не происходит, и страница входа в систему по-прежнему отображается без перенаправления, а введенные учетные данные исчезают.Это не кажется правильным.Также пытались добавить, используя проверку подлинности Cookie, но не могут отобразить cookie, и JWT, но не знаю, куда отправлять токены.Как мне заставить это работать?В идеале я хотел бы, чтобы прошла первая аутентификация, чтобы страница входа в систему не отображалась в перенаправлении, но это может быть намного сложнее.Код Startup.cs во всех приложениях показан ниже, чтобы проверить, отсутствует ли что-то очевидное.
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)
{
// Authentication/Authorisation (Identity) Context
services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseSqlServer(Configuration["WCX_Identity_Connection"],
sqlOptions => sqlOptions.MigrationsAssembly(typeof(Startup).GetTypeInfo().
Assembly.GetName().Name));
},
ServiceLifetime.Scoped
);
// Configure default Identity implementation
services.AddDefaultIdentity<ApplicationUser>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultUI()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<ApplicationDbContext>();
// Register no-op EmailSender used by account confirmation and password reset during development
// For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=532713
services.AddSingleton<Microsoft.AspNetCore.Identity.UI.Services.IEmailSender, EmailSender>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
// 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();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
Для первого приложения ниже показан код Home Controller, и он отлично работает с использованием таблиц Identity, настроенных дляприложения.Другие приложения также указывают на ту же базу данных.
public class HomeController : Controller
{
[Authorize]
public IActionResult Index()
{
// The home page is redirected dependent on currently logged in user details stored in the Identity tables.
if (User.Identity.IsAuthenticated)
{
using (var context = new WCX_IdentityContext())
{
// Use Identity and EF core to retrieve logged on user details
var identity = (ClaimsIdentity)User.Identity;
// The AspNetUsers Identity table contains the basic identity details
var user = context.AspNetUsers.SingleOrDefault(x => x.UserName == identity.Name);
// The AspNetApplicationUsers table contains the application ids the logged on user is authorised to use
var appUserIds = context.AspNetApplicationUsers.Where(x => x.UserId == user.Id).Select(y => y.ApplicationId);
List<ApplicationLink> applicationLinks = new List<ApplicationLink>();
foreach (var appUserId in appUserIds)
{
// The AspNetApplications table contains the application name and redirect url
var app = context.AspNetApplications.SingleOrDefault(x => x.Id == appUserId);
if (app != null)
{
applicationLinks.Add(new ApplicationLink
{
ApplicationName = app.ApplicationName,
AppUrl = app.AppUrl
});
}
}
if (applicationLinks.Count == 0)
{
// Redirect to display no applications available
return RedirectToAction("Unavailable");
}
else if (applicationLinks.Count == 1)
{
// Redirect to application url
return Redirect(applicationLinks[0].AppUrl);
}
else
{
// Show hyperlinks on home page
return View(applicationLinks);
}
}
}
return View();
}
![Protected Application](https://i.stack.imgur.com/hWdDD.png)
![Microsoft Identity Login Page](https://i.stack.imgur.com/nbYSm.png)
![Hyperlinks To Protected Applications](https://i.stack.imgur.com/CFxl8.png)