asp.net核心身份和身份服务器

时间:2018-10-19 10:19:05

标签: asp.net asp.net-core identityserver4

我正在跟踪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内核中引起了什么变化?

3 个答案:

答案 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();
});