You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 05:06:28