如何在 ASP.NET Core 6 MVC 中使用区域登录

How to use an area for login in ASP.NET Core 6 MVC

我用默认的方式创建了一个区域。右键单击项目并添加一个新的脚手架项。选定区域,为其命名并创建文件夹结构。

我的区域叫做Login。我使用名为 Login 的方法创建了一个名为 AccountController 的控制器(在 Areas/Login/Controllers 文件夹中),该方法只执行 return view();.

在我的 HomeController 中,我添加了一个 [Authorize] 属性,唯一的操作是默认索引。

我有我的路线设置:

app.UseEndpoints(endpoints => {
    endpoints.MapControllerRoute(name: "login",
              pattern: "{area:exists}/{controller=Account}/{action=Login}/{id?}");
    endpoints.MapControllerRoute(name: "default",
              pattern: "{controller=Home}/{action=Index}/{id?}"); 
});

我用断点进行了测试,我正确地点击了区域内的 AccountController > Login 操作,但是当它 returns 视图时它找不到视图 Areas/Login/Views/Account/Login.cshtml.

它实际上是在主站点中查找。如果我在主站点的 Views/Shared 文件夹中添加一个 Login.cshtml 文件,它将加载它。

我觉得我在 program.cs 文件中的某处缺少配置步骤,但我不知道它会是什么。就像身份不在正确的位置,或者我必须指定它在一个区域中。帮我欧比万。

我自己想出来了。这就是使用我自己的自定义 controller/path/view 创建身份重定向到区域的方法,而不是使用内置在神奇身份页面中的 asp.net 核心。

  1. 在program.cs中添加端点以映射路线。

     endpoints.MapAreaControllerRoute(
     name: "Buffoon", 
     areaName: "Buffoon", 
     pattern: "Buffoon/{controller=Account}/{action=Login}");
    
  2. 在您的代码中创建区域;右键单击网站,select 添加 > 新建脚手架项,Select 区域,输入区域名称。

  3. 在区域中添加您的控制器和视图以匹配您的路线默认值。

  4. [Area("Area_Name")] 标记您所在区域内的控制器。在上面的示例中,我会使用 [Area("Buffoon")]

  5. 在您的 program.cs 文件的构建器配置区域中,在应用程序 cookie 中设置登录路径变量。使用我上面的例子;

builder.Services.ConfigureApplicationCookie(cke => { cke.LoginPath = "/Buffoon/Account/Login"; });

  1. 将您的身份添加到构建器配置区域。我正在使用 Sql 服务器和 Entity Framework 所以这是我之前已经配置的示例。 (User 是继承自 IdentityUser 的自定义 class,MyDbContext 是继承自 IdentityDbContext<User> 的自定义 EF 上下文。

builder.Services.AddIdentity<User, IdentityRole>(cfg => { cfg.User.RequireUniqueEmail = true; }).AddEntityFrameworkStores<MyDbContext>();

  1. 确保您已将 app.UseAuthentication();app.UseAuthorization(); 添加到 program.cs 文件的应用程序配置部分。

  2. 最后,我在我的默认路由主页控制器上放置了一个 [Authorize] 属性,点击它后,重定向发生在我新创建的区域并显示我的登录视图。