更新 ASP.NET Core 7 中的 Identity 路由

· 3 分钟阅读

甚至想知道微软如何命名如此罕见的东西?我一直认为他们并没有真正做得那么好,但是,事实就是如此!

这样做的好处是,您在开发过程中几乎可以改变一切!

您是否曾经进入过一个页面,只需执行注册或登录过程就立即意识到这是一个 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/LoginAccount/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" 更新了顶部部分,现在我们测试它是否有效:

也有效!

就是这样我希望您学会了如何更新此网址,主要是因为在某些项目中,当您以某种方式执行网址时,然后身份看起来不同,这很糟糕,哈哈!

如果您需要任何东西,请向我发推文或给我发送电子邮件,我会尽力提供帮助!