如何将.NET Core Identity Razor页面部署至非默认位置(如MVC首页)
在.NET Core 6 MVC的Home/Index中承载Identity登录页(非iframe方案)
方案一:复用Identity登录逻辑,仅迁移UI到MVC视图
这种方式不需要重写登录验证逻辑,直接复用Identity自带的Razor Page处理逻辑,只把登录表单放到Home/Index页面。
1. 提取登录表单UI到Partial View
- 在
Views/Shared目录下创建_LoginFormPartial.cshtml文件 - 复制
Areas/Identity/Pages/Account/Login.cshtml中的核心表单内容到这个Partial里,保留模型绑定和验证:
@using Microsoft.AspNetCore.Identity @model LoginInputModel <div class="login-form"> <h2>登录</h2> <form asp-area="Identity" asp-page="/Account/Login" method="post"> <div asp-validation-summary="All" class="text-danger"></div> <div class="form-group"> <label asp-for="Email"></label> <input asp-for="Email" class="form-control" /> <span asp-validation-for="Email" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Password"></label> <input asp-for="Password" class="form-control" /> <span asp-validation-for="Password" class="text-danger"></span> </div> <div class="form-group"> <div class="checkbox"> <label asp-for="RememberMe"> <input asp-for="RememberMe" /> @Html.DisplayNameFor(m => m.RememberMe) </label> </div> </div> <button type="submit" class="btn btn-primary">登录</button> </form> </div>
注意:表单的
asp-area和asp-page属性要指向Identity的Login Razor Page,提交请求会直接交给原Identity处理逻辑,无需在MVC控制器重写登录方法。
2. 在Home/Index.cshtml中引用Partial View
打开Views/Home/Index.cshtml,在需要显示登录表单的位置添加:
@await Html.PartialAsync("_LoginFormPartial")
若Partial未添加命名空间,需在Index页顶部补充:
@using Microsoft.AspNetCore.Identity
3. 配置登录跳转(可选)
如果希望登录后默认返回Home/Index,可在Program.cs中修改Cookie配置:
builder.Services.ConfigureApplicationCookie(options => { options.LoginPath = "/Home/Index"; options.LogoutPath = "/Home/Index"; options.AccessDeniedPath = "/Home/Index"; options.ReturnUrlParameter = "ReturnUrl"; });
方案二:MVC控制器直接处理登录逻辑
如果希望完全脱离Identity的Razor Page,在MVC控制器中处理登录请求,可按以下步骤操作:
1. 创建登录ViewModel
在Models目录下创建LoginViewModel.cs:
using System.ComponentModel.DataAnnotations; public class LoginViewModel { [Required] [EmailAddress] public string Email { get; set; } [Required] [DataType(DataType.Password)] public string Password { get; set; } [Display(Name = "记住我?")] public bool RememberMe { get; set; } }
2. 在HomeController中添加登录Action
注入Identity核心服务并实现登录逻辑:
private readonly SignInManager<IdentityUser> _signInManager; private readonly UserManager<IdentityUser> _userManager; public HomeController(SignInManager<IdentityUser> signInManager, UserManager<IdentityUser> userManager) { _signInManager = signInManager; _userManager = userManager; } [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) { returnUrl ??= Url.Content("~/"); if (ModelState.IsValid) { var user = await _userManager.FindByEmailAsync(model.Email); if (user != null) { var result = await _signInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, lockoutOnFailure: false); if (result.Succeeded) { return LocalRedirect(returnUrl); } if (result.IsLockedOut) { ModelState.AddModelError(string.Empty, "账号已锁定,请稍后再试。"); return View("Index", model); } } ModelState.AddModelError(string.Empty, "无效的登录尝试。"); } // 验证失败返回登录页 return View("Index", model); }
3. 修改Home/Index.cshtml的表单
将表单提交路径指向HomeController的Login Action:
@model LoginViewModel <div class="login-form"> <h2>登录</h2> <form asp-action="Login" method="post"> <input type="hidden" asp-for="ReturnUrl" /> <div asp-validation-summary="All" class="text-danger"></div> <div class="form-group"> <label asp-for="Email"></label> <input asp-for="Email" class="form-control" /> <span asp-validation-for="Email" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Password"></label> <input asp-for="Password" class="form-control" /> <span asp-validation-for="Password" class="text-danger"></span> </div> <div class="form-group"> <div class="checkbox"> <label asp-for="RememberMe"> <input asp-for="RememberMe" /> @Html.DisplayNameFor(m => m.RememberMe) </label> </div> </div> <button type="submit" class="btn btn-primary">登录</button> </form> </div>
关键配置检查
确保Program.cs中已正确配置Identity与MVC服务:
builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>(); builder.Services.AddControllersWithViews(); builder.Services.AddRazorPages(); var app = builder.Build(); app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.MapRazorPages(); app.Run();
内容的提问来源于stack exchange,提问作者NovaDev
相关产品推荐
相关产品推荐

