在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
最简单的方法是将Pages文件夹拖出区域/标识到主项目请记住,@ page指令(在.cshtml中)会导致视图可以直接访问“页面”下的任何内容(页面)变为动作)如果你想更改默认/帐户/登录等页面,你也可以将帐户文件夹重命名为其他名称
@page指令也可用于指定自定义路径,例如:@page“/ Login”
通过导航到/ Login可以直接访问登录页面
URL重写中间件可能是一个解决方案:
var options = new RewriteOptions() .AddRewrite(@"^Account/(.*)", "Identity/Account/$1", skipRemainingRules: true); app.UseRewriter(options);