在ASP.NET Core Identity UI中更改路由?

Phi*_*l K 18 c# asp.net-core asp.net-core-identity

自ASP.NET Core 2.1发布以来,我正在使用新的Identity UI软件包.使用新生成的MVC项目,这里有一些可用的页面URL:

/Home/About
/Home/Contact
/Identity/Account/Login
/Identity/Account/Register
Run Code Online (Sandbox Code Playgroud)

如何配置路由以/Identity/从URL中删除部分?

Kir*_*kin 15

看起来这还不可能.查看源代码,很明显区域名称是硬编码的IdentityDefaultUIConfigureOptions<TUser>:

private const string IdentityUIDefaultAreaName = "Identity";
Run Code Online (Sandbox Code Playgroud)

这在少数几个地方使用,包括配置Razor Pages时.例如:

options.Conventions.AuthorizeAreaFolder(IdentityUIDefaultAreaName, "/Account/Manage");
Run Code Online (Sandbox Code Playgroud)

并且在配置Cookies身份验证时也是如此.例如:

options.LoginPath = $"/{IdentityUIDefaultAreaName}/Account/Login";
Run Code Online (Sandbox Code Playgroud)

值得注意的是,IdentityDefaultUIConfigureOptions<TUser>它本身是受保护的,因此覆盖选项的能力似乎不存在.

我打开了一个Github问题,看看我们是否可以从参与项目本身的人那里获得反馈.


2018-06-12更新

来自ASP.NET核心身份团队的Javier Calvarro Nelson在我提出的Github问题中提供了一些有价值的反馈,可归纳如下:

Identity UI位于某个区域的主要原因是最大限度地减少对应用程序的影响,并在应用程序代码和身份代码之间提供清晰的分离.

当想要自定义URL时,Javier建议使用以下选项之一:

  • 使用默认UI的scaffolding元素并自行进行所有必要的自定义.
  • 使用重定向规则将旧路由指向新路由.
  • 根本不要使用默认UI.

虽然不受支持且不推荐,但Javier还指出可以使用自定义IPageApplicationModelConvention来覆盖URL.但是,如果您错过了,则不受支持,不推荐使用.


2018-06-27更新

官方文档现在已经更新,以更好地解释说URL变化.


Bla*_*erX 6

最简单的方法是将Pages文件夹从Areas / Identity中拖出到主项目中。请记住,@ page指令(在.cshtml中)使视图可直接用于“ Pages”(页面)下的任何视图。变成一个动作)如果您想更改默认的/ Account / Login等页面,也可以将Account文件夹重命名为其他名称

@page指令还可用于指定自定义路径,例如:@page“ / Login”

通过导航到/ Login直接访问登录页面


Yan*_*nga 5

在您的startup.cs中,您可以更改:

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
Run Code Online (Sandbox Code Playgroud)

用:

    services.AddMvc().AddRazorPagesOptions(o => o.Conventions.AddAreaFolderRouteModelConvention("Identity", "/Account/", model =>
    {
        foreach (var selector in model.Selectors)
        {
            var attributeRouteModel = selector.AttributeRouteModel;
            attributeRouteModel.Order = -1;
            attributeRouteModel.Template = attributeRouteModel.Template.Remove(0, "Identity".Length);
        }
    })
).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
Run Code Online (Sandbox Code Playgroud)

它会路由:

/身份/帐号/登录/帐号/登录

/身份/帐号/注册/帐号/注册

等等...

要处理ReturnUrl,您可以创建一个新的Action:

    [Route("Identity/Account/Login")]
    public IActionResult LoginRedirect(string ReturnUrl)
    {
        return Redirect("/Account/Login?ReturnUrl=" + ReturnUrl);
    }
Run Code Online (Sandbox Code Playgroud)