代码之家  ›  专栏  ›  技术社区  ›  Phil K

更改ASP.NET核心标识用户界面中的路由?

  •  15
  • Phil K  · 技术社区  · 6 年前

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

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

    如何配置路由以删除 /Identity/ 从网址中分离出来?

    5 回复  |  直到 5 年前
        1
  •  14
  •   Kirk Larkin    6 年前

    看来这还不可能。看看源代码,很明显区域名是 hardcoded in IdentityDefaultUIConfigureOptions<TUser> :

    private const string IdentityUIDefaultAreaName = "Identity";
    

    这在一些地方使用,包括 configuring Razor Pages . 例如。:

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

    而且当 configuring the Cookies authentication . 例如。:

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

    值得注意的是 identityDefaultuiconfigureOptions<用户> 自身受到保护,因此覆盖选项的功能似乎不存在。

    我开了一个 Github issue 看看我们是否能从参与项目的人那里得到反馈。


    2018-06-12更新

    来自ASP.NET核心身份团队的Javier Calvarro Nelson在 吉特布问题 我提出,可以总结如下:

    标识ui位于某个区域的主要原因是将对应用程序的影响降至最低,并在应用程序代码和标识代码之间提供一个干净的分隔。

    Javier建议在自定义URL时使用以下选项之一:

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

    虽然 不支持也不推荐 ,哈维尔也指出 可能的 使用自定义 IPageApplicationModelConvention 覆盖URL。但是,如果你错过了,这是 不支持也不推荐 .


    2018-06-27更新

    这个 official documentation 现在已经更新以更好地解释所说的url更改。

        2
  •  5
  •   Yanga    6 年前

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

    它将路由:

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

    /身份/账户/登记 /帐户/注册

    等。。。

    处理 回春 可以创建新操作:

        [Route("Identity/Account/Login")]
        public IActionResult LoginRedirect(string ReturnUrl)
        {
            return Redirect("/Account/Login?ReturnUrl=" + ReturnUrl);
        }
    
        3
  •  4
  •   BlackTigerX Borut Tomazin    6 年前

    最简单的方法是将pages文件夹从区域/标识拖到主项目中 记住,@page指令(在.cshtml中)使视图可以直接访问“pages”下的任何内容(该页被转换为一个操作) 如果要更改默认值,也可以将帐户文件夹重命名为其他名称 /帐户/登录等页面

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

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

        4
  •  0
  •   Ryan Dines    6 年前

    就路由而言,它的标准是在web框架中修复认证url,django做了同样的事情。下面是如何根据您的喜好定制视图的方法,因此,我们将告诉identity不要包含他们的视图,而是提供到我们的视图的路径,而不是从路由中删除/identity/。

    Startup.cs :

    // USE METHOD WITH LESS DEFAULTS
    //
    // services.AddDefaultIdentity<IdentityUser>()
    //    .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddIdentity<IdentityUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .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,根据您的需要进行自定义:

    <div class="container body-content">
    
    
    <h2>Register</h2>
    
    <div class="row">
        <div class="col-md-4">
            <form method="post" action="/Identity/Account/Register" novalidate="novalidate">
                <h4>Create a new account.</h4>
                <hr>
                <div class="text-danger validation-summary-valid" data-valmsg-summary="true"><ul><li style="display:none"></li>
    </ul></div>
                <div class="form-group">
                    <label for="Input_Email">Email</label>
                    <input class="form-control" type="email" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Input_Email" name="Input.Email" value="">
                    <span class="text-danger field-validation-valid" data-valmsg-for="Input.Email" data-valmsg-replace="true"></span>
                </div>
                <div class="form-group">
                    <label for="Input_Password">Password</label>
                    <input class="form-control" type="password" data-val="true" data-val-length="The Password must be at least 6 and at max 100 characters long." data-val-length-max="100" data-val-length-min="6" data-val-required="The Password field is required." id="Input_Password" name="Input.Password">
                    <span class="text-danger field-validation-valid" data-valmsg-for="Input.Password" data-valmsg-replace="true"></span>
                </div>
                <div class="form-group">
                    <label for="Input_ConfirmPassword">Confirm password</label>
                    <input class="form-control" type="password" data-val="true" data-val-equalto="The password and confirmation password do not match." data-val-equalto-other="*.Password" id="Input_ConfirmPassword" name="Input.ConfirmPassword">
                    <span class="text-danger field-validation-valid" data-valmsg-for="Input.ConfirmPassword" data-valmsg-replace="true"></span>
                </div>
                <button type="submit" class="btn btn-default">Register</button>
            <input name="__RequestVerificationToken" type="hidden" value="CfDJ8IWbPHM_NTJDv_7HGewWzbbRveP09yQOznYdTWL2aN5X_4_eVbNE1w8D_qz7zegloVtdAhuVOJbJLQo0ja73FB3PgYycyGpn-DfX3fJqv4Cx8ns6Ygh6M7nMxV0eozO7hoDxUfPwrIJb2RcFtyzhPpMevZ4P0M8aVyBP55SP-5C4l23dCtDXXUOAY_YLwt67dw"></form>
        </div>
    </div>
    
    
            <hr>
            <footer>
                <p>© 2018 - SqlServerApp</p>
            </footer>
        </div> 
    
        5
  •  0
  •   Corwin    6 年前

    URL Rewriting Middleware 可能是一个解决方案:

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