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

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

/Home/About /Home/Contact /Identity/Account/Login /Identity/Account/Register 

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

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

 private const string IdentityUIDefaultAreaName = "Identity"; 

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

 options.Conventions.AuthorizeAreaFolder(IdentityUIDefaultAreaName, "/Account/Manage"); 

并且在配置Cookies身份validation时也是如此。 例如:

 options.LoginPath = $"/{IdentityUIDefaultAreaName}/Account/Login"; 

值得注意的是IdentityDefaultUIConfigureOptions本身受到保护,因此覆盖选项的能力似乎不存在。

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


2018-06-12更新

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

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

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

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

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


2018-06-27更新

官方文档现已更新,以更好地解释所述URL更改。

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

 services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); 

用:

  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); 

它将路由:

/身份/帐户/登录 /帐户/登录

/身份/账户/注册 /账户/注册

等等…

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

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

就路由而言,它在Web框架中的标准是修复了认证URL,Django做了同样的事情。 以下是如何根据自己的喜好自定义视图,因此我们不会从路径中删除/ Identity /,而是告诉Identity不要包含他们的视图并提供到我们的路径。

转到Startup.cs

 // USE METHOD WITH LESS DEFAULTS // // services.AddDefaultIdentity() // .AddEntityFrameworkStores(); services.AddIdentity(options => options.Stores.MaxLengthForKeys = 128) .AddEntityFrameworkStores() .AddDefaultTokenProviders(); // // ADD A ROUTE BELOW THE DEFAULT ROUTE // routes.MapRoute( name: "identity", template: "Identity/{controller=Account}/{action=Register}/{id?}"); 

现在我们有了所有设置但是视图,所以我们需要按照我们通常在mvc中的方式建立路径。 建立一个帐户控制器。 将Index()更改为Register()。 在名为Account的视图中创建一个文件夹。 添加文件Register.cshtml ,这是原始的html,根据您的需求进行自定义:

 

Register

Create a new account.



© 2018 - SqlServerApp

最简单的方法是将Pages文件夹拖出区域/标识到主项目请记住,@ page指令(在.cshtml中)会导致视图可以直接访问“页面”下的任何内容(页面)变为动作)如果你想更改默认/帐户/登录等页面,你也可以将帐户文件夹重命名为其他名称

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

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

URL重写中间件可能是一个解决方案:

 var options = new RewriteOptions() .AddRewrite(@"^Account/(.*)", "Identity/Account/$1", skipRemainingRules: true); app.UseRewriter(options);