更新 ASP.NET Core 7 中的 Identity 路由
甚至想知道微软如何命名如此罕见的东西?我一直认为他们并没有真正做得那么好,但是,事实就是如此!
这样做的好处是,您在开发过程中几乎可以改变一切!
您是否曾经进入过一个页面,只需执行注册或登录过程就立即意识到这是一个 ASP.NET Web 项目?

这种情况在我身上发生过很多次,因为默认情况下,在您创建的项目中,您有这些 url 来执行登录和注册过程(您也有很多其他页面)。
因此,本教程展示了一种更新这些 URL 的方法,以便您的项目看起来更好!
默认行为
当我们创建 Blazor 项目并决定将其与 Identity 一起使用时,它会显示如下内容:
<imgalign=“中心”src=“https://i.imgur.com/2W8Oou9.png">
当我们尝试进行登录或注册过程时,我们会选择 /Identity/Account/Login 或 /Identity/Account/Register。
但是,如果我告诉您您实际上可以将这些 URL 更新为不同的呢?
搭建 Login 和 Register 页面
为了更新这些页面,微软隐藏了它们,但您可以快速搭建它们并进行您想要的更改!
为此,您需要在项目的上下文菜单中转到 Add Scaffolded Item,如下所示:

然后它将弹出一个模式,您必须选择 Identity 两次并单击 Add:

在此之后,它将弹出另一个模式,您可以在其中选择要更新整个身份中的哪些页面。您可以更新很多页面,但我们将重点关注 Account/Login 和 Account/Register:

现在让它工作一会儿,然后检查解决方案资源管理器,您会发现一些新文件:

这些新文件是 ASP.NET 在您选择添加身份时添加到您的项目中的登录和注册页面!
更新网址
您可能已经注意到,这些文件是 razor 文件,因为它们的扩展名是 cshtml,因此我们将使用指令来更新页面的 url:
@page "/login"
@model LoginModel
@{
ViewData["Title"] = "Log in";
}
<h1>@ViewData["Title"]</h1>
<div class="row">
<div class="col-md-4">
<section>
<form id="account" method="post">
<h2>Use a local account to log in.</h2>
<hr />
<div asp-validation-summary="ModelOnly" class="text-danger" role="alert"></div>
<div class="form-floating mb-3">
<input asp-for="Input.Email" class="form-control" autocomplete="username" aria-required="true" placeholder="[email protected]" />
<label asp-for="Input.Email" class="form-label">Email</label>
<span asp-validation-for="Input.Email" class="text-danger"></span>
</div>
<div class="form-floating mb-3">
<input asp-for="Input.Password" class="form-control" autocomplete="current-password" aria-required="true" placeholder="password" />
<label asp-for="Input.Password" class="form-label">Password</label>
<span asp-validation-for="Input.Password" class="text-danger"></span>
</div>
<div class="checkbox mb-3">
<label asp-for="Input.RememberMe" class="form-label">
<input class="form-check-input" asp-for="Input.RememberMe" />
@Html.DisplayNameFor(m => m.Input.RememberMe)
</label>
</div>
<div>
<button id="login-submit" type="submit" class="w-100 btn btn-lg btn-primary">Log in</button>
</div>
<div>
<p>
<a id="forgot-password" asp-page="./ForgotPassword">Forgot your password?</a>
</p>
<p>
<a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
</p>
<p>
<a id="resend-confirmation" asp-page="./ResendEmailConfirmation">Resend email confirmation</a>
</p>
</div>
</form>
</section>
</div>
<div class="col-md-6 col-md-offset-2">
<section>
<h3>Use another service to log in.</h3>
<hr />
@{
if ((Model.ExternalLogins?.Count ?? 0) == 0)
{
<div>
<p>
There are no external authentication services configured. See this <a href="https://go.microsoft.com/fwlink/?LinkID=532715">article
about setting up this ASP.NET application to support logging in via external services</a>.
</p>
</div>
}
else
{
<form id="external-account" asp-page="./ExternalLogin" asp-route-returnUrl="@Model.ReturnUrl" method="post" class="form-horizontal">
<div>
<p>
@foreach (var provider in Model.ExternalLogins!)
{
<button type="submit" class="btn btn-primary" name="provider" value="@provider.Name" title="Log in using your @provider.DisplayName account">@provider.DisplayName</button>
}
</p>
</div>
</form>
}
}
</section>
</div>
</div>
@section Scripts {
<partial name="_ValidationScriptsPartial" />
}
正如您所看到的,大部分内容都是相同的,但是如果您看一下课程中的第一行,我已经更新了之前的内容:
@page
到
@page "/login"
嗯,这很容易,不是吗?现在让我们快速测试一下它是否有效。
首先,让我们转到最初的默认页面,检查它是否仍然有效:

事实并非如此!现在让我们测试一下新的 url,即 /login:

它有效!
现在让我们对寄存器做同样的事情,我们更新它的页面并在 @page 指令中添加我们想要的路径,然后让我们做一个测试!
@page "/register"
@model RegisterModel
@{
ViewData["Title"] = "Register";
}
<h1>@ViewData["Title"]</h1>
<div class="row">
<div class="col-md-4">
<form id="registerForm" asp-route-returnUrl="@Model.ReturnUrl" method="post">
<h2>Create a new account.</h2>
<hr />
<div asp-validation-summary="ModelOnly" class="text-danger" role="alert"></div>
<div class="form-floating mb-3">
<input asp-for="Input.Email" class="form-control" autocomplete="username" aria-required="true" placeholder="[email protected]" />
<label asp-for="Input.Email">Email</label>
<span asp-validation-for="Input.Email" class="text-danger"></span>
</div>
<div class="form-floating mb-3">
<input asp-for="Input.Password" class="form-control" autocomplete="new-password" aria-required="true" placeholder="password" />
<label asp-for="Input.Password">Password</label>
<span asp-validation-for="Input.Password" class="text-danger"></span>
</div>
<div class="form-floating mb-3">
<input asp-for="Input.ConfirmPassword" class="form-control" autocomplete="new-password" aria-required="true" placeholder="password" />
<label asp-for="Input.ConfirmPassword">Confirm Password</label>
<span asp-validation-for="Input.ConfirmPassword" class="text-danger"></span>
</div>
<button id="registerSubmit" type="submit" class="w-100 btn btn-lg btn-primary">Register</button>
</form>
</div>
<div class="col-md-6 col-md-offset-2">
<section>
<h3>Use another service to register.</h3>
<hr />
@{
if ((Model.ExternalLogins?.Count ?? 0) == 0)
{
<div>
<p>
There are no external authentication services configured. See this <a href="https://go.microsoft.com/fwlink/?LinkID=532715">article
about setting up this ASP.NET application to support logging in via external services</a>.
</p>
</div>
}
else
{
<form id="external-account" asp-page="./ExternalLogin" asp-route-returnUrl="@Model.ReturnUrl" method="post" class="form-horizontal">
<div>
<p>
@foreach (var provider in Model.ExternalLogins!)
{
<button type="submit" class="btn btn-primary" name="provider" value="@provider.Name" title="Log in using your @provider.DisplayName account">@provider.DisplayName</button>
}
</p>
</div>
</form>
}
}
</section>
</div>
</div>
@section Scripts {
<partial name="_ValidationScriptsPartial" />
}
我已经用 @page "/login" 更新了顶部部分,现在我们测试它是否有效:

也有效!
就是这样我希望您学会了如何更新此网址,主要是因为在某些项目中,当您以某种方式执行网址时,然后身份看起来不同,这很糟糕,哈哈!
如果您需要任何东西,请向我发推文或给我发送电子邮件,我会尽力提供帮助!