我正在跟踪this walkthrough,将asp.net核心身份与IdentityServer集成在一起,但遇到了一些障碍。
如果我遵循指南并使用
,我将在哪里更新ConfigureServices方法services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
我无法再访问任何与帐户相关的功能。注册链接的路由从
开始更改~/Identity/Account/Register
到
~/?area=Identity&page=%2FAccount%2FRegister
哪个会中断所有与帐户相关的功能
如果我把它留在
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
然后路由仍然有效,我可以通过登录页面输入凭据,登录成功,但是
SignInManager.IsSignedIn(User)
返回假,所以我猜这里基本上是坏了。
我已将Identityserver添加到我的ConfigureServices:
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryPersistedGrants()
.AddInMemoryIdentityResources(Config.IdentityResources.GetIdentityResources())
.AddInMemoryApiResources(Config.APIResources.GetApiResources())
.AddInMemoryClients(Config.Clients.GetClients())
.AddAspNetIdentity<IdentityUser>();
有什么需要改变的想法-我猜它在最新版本的asp.net内核中引起了什么变化?
答案 0 :(得分:1)
在Net Core 2.1中,Microsoft删除了AccountController,并将所有的Identity逻辑移至Razor页面(现在没有其他可用的选择),这使该逻辑难以遵循(这使我想起了ASP Classic或PHP)。文档中的“快速入门”完全依赖于保留在原处的AccountController(不再是这种情况),并且猜测此方法需要先重写为Razor页面,然后一切正常。但是,在认证机制被破坏的同时,这样做没有多大意义。
我使用以下Startup.cs演示了将身份验证添加到新的Net Core 2.1项目中后在IdentityServer4中不再起作用。当访问受[Authorize]保护的控制器方法和显示为登录页面的质询时,它应该可以工作,但显示以下行为。
1)输入不正确的凭据会导致显示“无效的登录尝试”文本
2)输入正确的凭据无法通过身份验证,这可以通过没有注销链接或调试并观察到User.isAuthenticated为假
看到。可以对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中的工作方式。有谁比我更进一步,并且使此服务器正常工作?
答案 1 :(得分:0)
最后弄清楚了这一点。当MSFT迁移到Razor页面时,似乎是一个奇怪的错误。 我需要做的就是添加Scaffolding UI,它开始工作
答案 2 :(得分:0)
身份用户界面是使用Razor页面实现的。为了将它们映射到端点路由,请在UseEndpoints回调中添加对MapRazorPages的调用:
app.UseEndpoints(endpoints =>
{
// ...
endpoints.MapRazorPages();
});