提问者:小点点

Asp.Net 核心正确配置身份认证中间件


要求是我有 MVC

我正在使用核心标识 Asp.Net 在 .Net 5.0 上运行与用户管理相关的工作

我对在conigureservices()中配置多个身份方案和正确配置身份验证/授权管道感到困惑

>

  • 要配置多个身份验证方案,我 https://stackoverflow.com/a/64887479/2058413 提到,因为它是使用与我相同的版本完成的。所以我的启动方法如下,类似于该线程中的代码。

         public void ConfigureServices(IServiceCollection services)
         {
             string connectionString = Configuration.GetConnectionString("default");
             services.AddDbContext<AppDBContext>(c => c.UseSqlServer(connectionString));
    
             services.AddIdentity<IdentityUser, IdentityRole>()
                 .AddEntityFrameworkStores<AppDBContext>();
    
             services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                 .AddCookie(x =>
                 {
                     x.LoginPath = "/Account/Login";
                     x.ExpireTimeSpan = TimeSpan.FromMinutes(10d);
                     x.AccessDeniedPath = "/Account/Register";
                 })
                 .AddJwtBearer(x =>
                 {
                     x.RequireHttpsMetadata = false;
                     x.SaveToken = true;
                     x.TokenValidationParameters = new TokenValidationParameters
                     {
                         ValidateIssuerSigningKey = true,
                         IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("123456")),
                         ValidateIssuer = false,
                         ValidateAudience = false
                     };
                 });
    
             services.AddAuthorization(options =>
             {
                 var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(CookieAuthenticationDefaults.AuthenticationScheme, JwtBearerDefaults.AuthenticationScheme);
                 defaultAuthorizationPolicyBuilder = defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
                 options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
             });
    
    
             services.AddControllersWithViews();
         }
    

    我的应用配置方法如下

         public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
         {
             if (env.IsDevelopment())
             {
                 app.UseDeveloperExceptionPage();
             }
             else
             {
                 app.UseExceptionHandler("/Home/Error");
             }
             app.UseStaticFiles();
    
             app.UseRouting();
    
             app.UseAuthentication();
    
             app.UseAuthorization();
    
             app.UseEndpoints(endpoints =>
             {
                 endpoints.MapControllerRoute(
                     name: "default",
                     pattern: "{controller=Home}/{action=Index}/{id?}");
             });
         }
    

    然后控制器中的测试方法(用户在身份验证后应重定向到其中)如下

        [Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]
        public IActionResult Index()
        {
            return View();
        }
    

    据我了解,管道配置的顺序是正确的。现在这是我面临的问题。

    >

  • 如 中所述。添加饼干(选项=

    所以我删除了 JwtBearerDefaults.AuthenticationScheme;这将带我登录,成功登录后,我可以看到 HttpContext.User.Identity.IsAuthenticated 设置为 true。但它不会重定向到主页/索引。没有抛出错误,在浏览器控制台[网络选项卡]中,它显示302并重定向回登录。由于我已经将[Authorize(AuthenticationScheme = CookieAuthenticationDefaults.AuthenticationScheme)]添加到HomeController中的索引方法中,因此我尝试删除该方案并添加[Authorize]并重试。它仍然被重定向到登录页面。这是另一件事我很困惑 abo。!.!ut。

    所以我删除了与双重方案身份验证相关的所有内容,并留下了带有以下代码的 ConfigureService()

             string connectionString = Configuration.GetConnectionString("default");
             services.AddDbContext<AppDBContext>(c => c.UseSqlServer(connectionString));
    
             services.AddIdentity<IdentityUser, IdentityRole>()
                 .AddEntityFrameworkStores<AppDBContext>();
             services.AddControllersWithViews();
    

    现在一切正常(如果未经过身份验证,则重定向到登录,并在授权后重定向到 /Home/Index)。

    我也浏览了以下有关多方案身份验证的链接,但我仍然对此管道配置感到困惑。ASP.NET 核心 WebAPI Cookie JWT 身份验证 https://wildermuth.com/2017/08/19/Two-AuthorizationSchemes-in-ASP-NET-Core-2 https://mitchelsellers.com/blog/article/using-multiple-authentication-authorization-providers-in-asp-net-core

    我只需要这个多方案身份验证管道配置部分的帮助。


  • 共1个答案

    匿名用户

    好的,经过一些研究,主要问题是;

    1. 我混淆了在 StartUp(asp.net core 3.x 中注册服务的旧方法。所以必须清除所有这些。帮助我做到这一点的资源;

    从 ASP.NET 核心 3.1 迁移到 5.0

    ASP.NET 核心中间件

    这清理了许多不必要的代码,因为在 .Net 5 中可以使用一些快捷方式。

    1. 添加标识
    2. 设置饼干

    另一件事是,我不得不删除ConfigureApplicationCookie(),因为AddIdentity似乎正在这样做。同样在前面的AddAuthorization()中,我有代码来指定我想使用的默认方案(Cookie

    [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] 
    

    通常,正确设置启动似乎很棘手,具体取决于您使用的不同服务。顺序很重要