web-dev-qa-db-ja.com

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/部分を削除するようにルーティングを構成するにはどうすればよいですか?

16
Phil K

これはまだ不可能なようです。ソースコードを見ると、エリア名が IdentityDefaultUIConfigureOptions<TUser>

private const string IdentityUIDefaultAreaName = "Identity";

これは、 Razor Pages を構成するときなど、いくつかの場所で使用されます。例えば。:

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

また、 Cookies authentication を構成する場合も同様です。例えば。:

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

IdentityDefaultUIConfigureOptions<TUser>自体は保護されているため、オプションをオーバーライドする機能は存在しないようです。

Github issue を開いて、プロジェクト自体に関係する人々からフィードバックを得ることができるかどうかを確認しました。


2018-06-12更新

ASP.NET Core IdentityチームのJavier Calvarro Nelsonは、 Github issue でいくつかの貴重なフィードバックを提供しました。これは次のように要約できます。

アイデンティティUIがエリア内にある主な理由は、アプリへの影響を最小限に抑え、アプリコードとアイデンティティコードを明確に分離するためです。

Javierは、URLをカスタマイズする場合、次のオプションのいずれかをお勧めします。

  • デフォルトUIのscaffolding要素を使用して、必要なカスタマイズをすべて自分で行います。
  • 古いルートを新しいルートにポイントするリダイレクトルールを使用します。
  • デフォルトUIをまったく使用しないでください。

サポートされておらず、推奨されていませんが、Javierはpossibleがカスタム IPageApplicationModelConvention でURLを上書きします。ただし、見逃した場合は、これはサポートされておらず、推奨されません


2018-06-27更新

公式ドキュメント が更新され、前述のURLの変更をより適切に説明できるようになりました。

14
Kirk Larkin

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

ルーティングされます:

/ Identity/Account/Login to / Account/Login

/ Identity/Account/Register to / Account/Register

等...

ReturnUrlを処理するには、新しいアクションを作成できます。

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

最も簡単な方法は、PagesフォルダーをAreas/Identityからメインプロジェクトにドラッグすることです。@ pageディレクティブ(.cshtml内)により、 "Pages"(ページデフォルトの/アカウント/ログインなどのページを変更したい場合は、アカウントフォルダの名前を別の名前に変更することもできます

@pageディレクティブを使用して、次のようなカスタムパスを指定することもできます。@page "/ Login"

/ Loginに移動して、ログインページに直接アクセスする

4
BlackTigerX

ルーティングに関する限り、Webフレームワークの標準は認証URLを修正し、Djangoは同じことをします。 /ルートから、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> 
0
Ryan Dines

RL Rewriting Middleware は解決策かもしれません:

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