ASP.NET Coreは、サイト間ログインリダイレクトの新しい姿勢を実現

3553 ワード

としてNETプログラマー、苦痛の一つはASP.NET誕生の日から最新のASP.NET Coreでは、アクセスなどのサイト間ログインリダイレクトを直接実現できません.https://q.cnblogs.com、にジャンプhttps://passport.cnblogs.comログイン)は、現在のサイトにのみジャンプできます.
具体的にはASP.NET CoreはLoginPathはパスのみ、ホスト名を含む完全url、ASPを指定できません.NET Coreではリダイレクト時に現在要求されているホスト名が自動的に追加されます.
services.AddAuthentication()
.AddCookie(options =>
{
    options.LoginPath = "/account/signin";
});

ReturnUrlクエリーパラメータにもパスのみが含まれ、完全なurlは含まれません.
痛みを解消するため、ASP.NET時代に私たちが服用した解毒剤はASPを使わないか.NETのログインジャンプメカニズムは、専用のUserControllerを介しています.Login Actionは二次ジャンプを行い、ASP.NET Core時代に私たちはMiddlewareの解毒剤を服用し、専門のMiddlewareでジャンプしました(面倒です).
昨日ASPを読みました.NET Core Authenticationのソースコードの後、新しい解毒剤を見つけました.CookieAuthenticationEventsを修正しました.OnRedirectToLoginは、サイト間ログインのリダイレクトを依頼します.
以下は新解毒剤の作り方です.
スタータープでConfigureServicesでAddCookieに次の構成コードを追加し、変更されたurlを使用してリダイレクトします.
services.AddAuthentication()
.AddCookie(options =>
{
    var originRedirectToLogin = options.Events.OnRedirectToLogin;
    options.Events.OnRedirectToLogin = context =>
    {
        return originRedirectToLogin(RebuildRedirectUri(context));
    };
});

RebuildRedirectUriの実装コードは次のとおりです.
private static RedirectContext RebuildRedirectUri(
    RedirectContext context)
{
    if (context.RedirectUri.StartsWith(ACCOUNT_SITE))
        return context;

    var originUri = new Uri(context.RedirectUri);
    var uriBuilder = new UriBuilder(ACCOUNT_SITE);
    uriBuilder.Path = originUri.AbsolutePath;
    var queryStrings = QueryHelpers.ParseQuery(originUri.Query);
    var returnUrlName = context.Options.ReturnUrlParameter;
    var returnUrl = originUri.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped) + queryStrings[returnUrlName];
    uriBuilder.Query = QueryString.Create(returnUrlName, returnUrl).ToString();
    context.RedirectUri = uriBuilder.ToString();
    return context;
}

以上のコードの山はurlの変換を実現するために用いられて、詳しくは博問を参照してくださいhttps://q.cnblogs.com/q/108087/
この長い間の苦しみはやっとASPに基づいている.NET Coreの強力な拡張と配置能力は比較的優雅に解消されました.