[英]How to use an area for login in ASP.NET Core 6 MVC
我使用默认方法创建一个区域。 右键单击项目并添加一个新的脚手架项目。 选择区域,给它命名并创建文件夹结构。
我的区域称为Login
。 我创建了一个名为AccountController
的 controller(在Areas/Login/Controllers
文件夹中),其中包含一个名为Login
的方法,该方法只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 操作,但是当它返回视图时它没有找到视图Areas/Login/Views/Account/Login.cshtml
。
它实际上是在主站点中查找。 如果我在主站点的Views/Shared
文件夹中添加一个Login.cshtml
文件,它将加载它。
我觉得我在program.cs
文件中的某处缺少配置步骤,但我不知道它会是什么。 就像身份不在正确的位置,或者我必须指定它在一个区域中。 帮帮我,欧比万。
我自己想出来了。 这就是使用我自己的自定义控制器/路径/视图而不是使用内置于神奇身份页面的 asp.net 核心创建身份重定向到区域的方法。
在 program.cs 中添加一个端点到 map 路由。
endpoints.MapAreaControllerRoute( name: "Buffoon", areaName: "Buffoon", pattern: "Buffoon/{controller=Account}/{action=Login}");
在您的代码中创建区域; 在Website上右击,select Add > New Scaffolded item,Select Area,输入Area Name。
添加您的 controller 并在该区域查看以匹配您的路线默认值。
使用[Area("Area_Name")]
在您的区域内标记您的 controller 。 在我上面的例子中,我会使用[Area("Buffoon")]
在 program.cs 文件的构建器配置区域中,在应用程序 cookie 中设置登录路径变量。 使用我上面的例子;
builder.Services.ConfigureApplicationCookie(cke => { cke.LoginPath = "/Buffoon/Account/Login"; });
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 文件的应用程序配置部分。
最后,我在我的默认路由 home controller 上放置了一个[Authorize]
属性,点击它后,重定向发生在我新创建的区域并显示我的登录视图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.