В Net Core 2.1 Microsoft удалила AccountController и переместила всю логику Identity на страницы Razor (альтернативы в настоящее время нет), что затрудняет следование логике (напоминает мне классику ASP или PHP).Быстрый старт в документации полностью основан на том, что AccountController остается на месте (уже не так), и думаю, что это должно быть переписано как страницы Razor, прежде чем что-то будет работать.Однако в этом нет особого смысла, хотя механизм аутентификации не работает.
Я использовал следующие файлы Startup.cs, чтобы продемонстрировать, что аутентификация больше не работает в IdentityServer4 при добавлении в новый проект Net Core 2.1.,Он должен работать, но демонстрирует следующее поведение при доступе к методу контроллера, защищенного [Авторизоваться], и вызову, представленному на странице входа.
1) При вводе неверных учетных данных отображается текст «Недопустимая попытка входа»
2) При вводе правильных учетных данных проверка подлинности не выполняется, и это видно по отсутствию ссылки на выход из системы или отладке.и наблюдая, что User.isAuthenticated имеет значение false
В файл Startup.cs можно внести несколько изменений, чтобы показать, что аутентификация работает, когда IdentityServer отключен и включена стандартная аутентификация.Просто закомментируйте блок, начинающийся с «services.AddIdentityServer (options =>»), чтобы отключить IdentityServer. Далее закомментируйте «useIdentityServer ()» и раскомментируйте «useAuthentication ()», и все аутентификации снова будут работать правильно.
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.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.Lax;
});
// Add authentication options
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.ClientId = "mvc";
options.ClientSecret = "secret";
options.ResponseType = "code id_token";
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.Scope.Add("api1");
options.Scope.Add("offline_access");
});
// Identity Context
services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseSqlServer(Configuration["IdentityConnection"],
sqlOptions => sqlOptions.MigrationsAssembly(typeof(Startup).GetTypeInfo().
Assembly.GetName().Name));
},
ServiceLifetime.Scoped
);
// Configure default Identity implementation
services.AddDefaultIdentity<ApplicationUser>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultUI()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<ApplicationDbContext>();
// Add application services.
services.AddTransient<Microsoft.AspNetCore.Identity.UI.Services.IEmailSender, EmailSender>();
services.AddMvc();
// configure identity server with in-memory stores, keys, clients and scopes
services.AddIdentityServer(options =>
{
options.UserInteraction.LoginUrl = "/Identity/Account/Login";
options.UserInteraction.LogoutUrl = "/Identity/Account/Logout";
})
.AddDeveloperSigningCredential()
.AddInMemoryPersistedGrants()
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddAspNetIdentity<ApplicationUser>();
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(); // not needed, since UseIdentityServer adds the authentication middleware
app.UseIdentityServer();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
Я не уверен, как аутентификация работает в IdentityServer4, так как не следили за тем, как она будет работать в Net Core 2.1. Кто-нибудь прошел дальше меня и запустил этот сервер?