如何在 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 核心。
在program.cs中添加端点以映射路线。
endpoints.MapAreaControllerRoute(
name: "Buffoon",
areaName: "Buffoon",
pattern: "Buffoon/{controller=Account}/{action=Login}");
在您的代码中创建区域;右键单击网站,select 添加 > 新建脚手架项,Select 区域,输入区域名称。
在区域中添加您的控制器和视图以匹配您的路线默认值。
用 [Area("Area_Name")]
标记您所在区域内的控制器。在上面的示例中,我会使用 [Area("Buffoon")]
在您的 program.cs 文件的构建器配置区域中,在应用程序 cookie 中设置登录路径变量。使用我上面的例子;
builder.Services.ConfigureApplicationCookie(cke => { cke.LoginPath = "/Buffoon/Account/Login"; });
- 将您的身份添加到构建器配置区域。我正在使用 Sql 服务器和 Entity Framework 所以这是我之前已经配置的示例。 (
User
是继承自 IdentityUser
的自定义 class,MyDbContext
是继承自 IdentityDbContext<User>
的自定义 EF 上下文。
builder.Services.AddIdentity<User, IdentityRole>(cfg => { cfg.User.RequireUniqueEmail = true; }).AddEntityFrameworkStores<MyDbContext>();
确保您已将 app.UseAuthentication();
和 app.UseAuthorization();
添加到 program.cs 文件的应用程序配置部分。
最后,我在我的默认路由主页控制器上放置了一个 [Authorize]
属性,点击它后,重定向发生在我新创建的区域并显示我的登录视图。
我用默认的方式创建了一个区域。右键单击项目并添加一个新的脚手架项。选定区域,为其命名并创建文件夹结构。
我的区域叫做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 核心。
在program.cs中添加端点以映射路线。
endpoints.MapAreaControllerRoute( name: "Buffoon", areaName: "Buffoon", pattern: "Buffoon/{controller=Account}/{action=Login}");
在您的代码中创建区域;右键单击网站,select 添加 > 新建脚手架项,Select 区域,输入区域名称。
在区域中添加您的控制器和视图以匹配您的路线默认值。
用
[Area("Area_Name")]
标记您所在区域内的控制器。在上面的示例中,我会使用[Area("Buffoon")]
在您的 program.cs 文件的构建器配置区域中,在应用程序 cookie 中设置登录路径变量。使用我上面的例子;
builder.Services.ConfigureApplicationCookie(cke => { cke.LoginPath = "/Buffoon/Account/Login"; });
- 将您的身份添加到构建器配置区域。我正在使用 Sql 服务器和 Entity Framework 所以这是我之前已经配置的示例。 (
User
是继承自IdentityUser
的自定义 class,MyDbContext
是继承自IdentityDbContext<User>
的自定义 EF 上下文。
builder.Services.AddIdentity<User, IdentityRole>(cfg => { cfg.User.RequireUniqueEmail = true; }).AddEntityFrameworkStores<MyDbContext>();
确保您已将
app.UseAuthentication();
和app.UseAuthorization();
添加到 program.cs 文件的应用程序配置部分。最后,我在我的默认路由主页控制器上放置了一个
[Authorize]
属性,点击它后,重定向发生在我新创建的区域并显示我的登录视图。