ASP.Net Identity Login Redirect Enforce Protocol(Https)

EdSF

うまくいけば、私は本当に単純で明白な何かを見逃しているだけです-なぜ、そしてもっと重要なことに、リダイレクト中にプロトコルをどのように維持(または強制)するのLoginですか?

説明する:

リクエストトレース

  • 元のプロトコルは https
  • これ はの ようなものの「デフォルト」であるはずだと思う かもしれ login ませんが、示されているように、リダイレクト(らしい)はそれを維持していません。

私が試したもの:

  • RequireHttps使用できる属性がありますが、次のとおりです。

    1. 「そこ」に到達するのに2つのリダイレクトが必要になるのは「奇妙」のようです
    2. ロードバランサーがある場合やSSLが他の場所(サーバーではない)に「オフロード」されている場合、これはリダイレクトループになります(SSLはクライアントとフロントエンドネット/ SSLポンドの間、およびhttpボックス( es)/ application)。これは実際に私のプロダクションケースです...
  • 私はすでにIISURLの書き換えも設定しています(サイト全体でhttpsへの正規ルール)。 これは「無視」されているようです (ルールは「https」をチェックしません。そうでない場合は同じリダイレクトループが発生します)。

  • 絶対URLをLoginPath(でCookieAuthenticationOptions設定しようとしましたが失敗しました。それができないためです...

アドバイスやポインタをありがとう...


更新

「なぜ」

  1. ロードバランサーがある場合やSSLが他の場所(サーバーではない)に「オフロード」されている場合、これはリダイレクトループになります(SSLはクライアントとフロントエンドネット/ SSLポンドの間、およびhttpボックス( es)/ application)。これは実際には私のプロダクションケースです。

この(localhost-サーバーではなくローカル開発ボックス)要求シーケンスに示されているように、さらにいじくり回すと上記のようになります(上記の問題は、SSL処理が「スタックの上位」にある本番環境の負荷分散環境で発生します-例:ARR):

ローカルホストhttps

  • プロトコルは実際に維持されています
  • この問題はアプリケーションと「インフラストラクチャ」が「一致」しない状況に正確に関連しているようです。これは、コードで「負荷分散」/「Webファーム」環境(ホストではなくARRにあるARRなど)で実行する状況に似ているようです。そのような状況では、その小切手は常に返されます。Request.IsSecureConnectioncertfalse

それで、問題は本当にこれを回避する方法についてのガイダンスにありますか?


アップデート2

これを解決しようとして私の「方向」を変えてくれたリチャードに感謝します。私はもともと次の方法を探していました:

  • 安全なURLを(明示的に)使用し、評価方法を「オーバーライド」するようにOWIN / Identityに設定/通知しますLoginPathSecureCookieを処理する際(唯一の)オプションは、どういうわけか私をそのように導きました(HTTPSでのみCookieを明示的に言うことができる場合、それはあるLoginPath意味で、いずれかの方法でそうすることができるという印象を与えました

  • 私の頭の中の「ハッキー」な方法は、クライアント側(Javascript)に対処することでした。

結局、リチャードの答えは私をURL書き換えに連れて行った(それは私のコントロールを超えているので、まだLB側ではないが)。私は現在(私の環境に基づいて)作業しています:

<rule name="Redirect to HTTPS" stopProcessing="true">
    <match url=".*" />

    <conditions>
      <add input="{HTTP_CLUSTER_HTTPS}" pattern="^on$" negate="true" />
      <add input="{HTTP_CLUSTER_HTTPS}" pattern=".+" negate="true" />

    </conditions>
    <action type="Redirect" url="https://{HTTP_HOST}{SCRIPT_NAME}/{REQUEST_URI}" redirectType="SeeOther" />
</rule>

トンネルの終わりに光が見えます。


アップデート3

リチャードの探偵に改めて感謝します!最新の回答で私も調査しましたが、CookieApplyRedirectContextに関連するSOに関する投稿がかなりあることがわかりました...これが私の場合に固有のものであり、私が最初に求めていたものです:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
   AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
   LoginPath = new PathString("/Account/Login"),

   //This is why. If I could explicitly set this, then I (thought) I should
   //be able to explicitly enforce https (too..as a setting)
   //for the LoginPath...
   CookieSecure = CookieSecureOption.Always,

   Provider = new CookieAuthenticationProvider 
   {
      OnValidateIdentity = .....
      ,
      OnApplyRedirect = context =>
      {
         Uri absoluteUri;
          if (Uri.TryCreate(context.RedirectUri, UriKind.Absolute, out absoluteUri))
          {
             var path = PathString.FromUriComponent(absoluteUri);
             if (path == context.OwinContext.Request.PathBase + context.Options.LoginPath)
             {
                context.RedirectUri = context.RedirectUri.Replace("http:", "https:");
             }
           }
          context.Response.Redirect(context.RedirectUri);
        }
     }
});
リチャード

この問題は、アプリケーションが絶対URLへのリダイレクトを発行しているために発生しています。これは、ロードバランサーまたはアプリケーション自体の2つの方法のいずれかで修正できます。

ロードバランサー

リダイレクト応答をhttpからhttpsに書き換えるようにロードバランサーを構成します。ARRを使用している場合は、次のルール(ここから取得)が機能するはずです。

<rule name="forum-redirect" preCondition="IsRedirection" enabled="true">
  <match serverVariable="RESPONSE_LOCATION" pattern="^http://[^/]+/(.*)" />
  <conditions>
    <add input="{ORIGINAL_HOST}" pattern=".+" />
  </conditions>
  <action type="Rewrite" value="http://{ORIGINAL_HOST}/{R:1}" />
</rule>

他のロードバランサーでも同様の構成が必要になります。

応用

OWINが認証プロセスでリダイレクトするURLを相対URLに置き換えることができます。これは、プロトコルが以前にブラウザが使用していたものと同じままであることを意味します。

これを行う方法を見つけるには、Owinソースを少し掘り下げる必要がありましたが、アプリケーションのスタートアップに次の変更を加えると、問題が解決するはずです。まず、スタートアップ構成からCookieAuthenticationProvider初期化を抽出します。

変化する:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    Provider = new CookieAuthenticationProvider 
    {
        // Move these options in the step below...
    }
});

に:

var cookieProvider = new CookieAuthenticationProvider
{ 
    // ... Options from your existing application
};
// Modify redirect behaviour to convert login URL to relative
var applyRedirect = cookieProvider.OnApplyRedirect;
cookieProvider.OnApplyRedirect = context =>
{
    if (context.RedirectUri.StartsWith("http://" + context.Request.Host))
    {
        context.RedirectUri = context.RedirectUri.Substring(
            context.RedirectUri.IndexOf('/', "http://".Length));
    }
    applyRedirect(context);
};

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    Provider = cookieProvider
});

リダイレクトルールがどこに設定されているかを簡単に知ることはできませんが、OWINはデリゲートを使用して実際のリダイレクトを実行します。ここで行ったことは、そのデリゲートが保存され、与えられようとしているURLを変更してから、再度呼び出します。

このオプションを使用して、サイト内の他のリダイレクトとリンクが相対的であることを確認してください。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ASP.Net Identity - cannot login with password

分類Dev

use existing login table with asp.net core identity service

分類Dev

.Net Identity - Login with forged cookie

分類Dev

Customizing ASP.NET Identity

分類Dev

How do you disable HTTPS in ASP.NET Core project with Identity?

分類Dev

How do you disable HTTPS in ASP.NET Core project with Identity?

分類Dev

What is the use of asp.net identity .GenerateUserToken()

分類Dev

Verify Access Token - Asp.Net Identity

分類Dev

ASP.NET Core MVC MySQL Identity

分類Dev

soft delete in asp.net identity

分類Dev

Customizing ASP.NET Core Identity Tables

分類Dev

Asp.net core create interface for identity

分類Dev

asp.net identity with custom role

分類Dev

Redirect to Static file asp.net core

分類Dev

.net core Identity, getting meaningful login failed reason

分類Dev

ASP.Net aspxerrorpath = / Login.aspx

分類Dev

How can I enforce SSL using ASP.NET Core and nginx

分類Dev

ASP.net Identity 2.1 Get all users with roles

分類Dev

ASP.NET Identity2.0の拡張

分類Dev

ASP.NET Web API get user identity in controller constructor

分類Dev

How Does Identity Work in Asp .Net MVC 5

分類Dev

Why my asp.net identity -user will log out automatically

分類Dev

ASP.Net Identity running multiple queries on every request

分類Dev

ASP.NET Identity vs custom implementation, which one to use?

分類Dev

ASP.NET Identity 2 initializer drop all my tables

分類Dev

How to implement permission based authorization in ASP.net core Identity?

分類Dev

Role based authorization in ASP.NET Core 3.1 with Identity and ExternalLogin

分類Dev

Single Sign On with ASP.NET MVC 5 Identity

分類Dev

Unique token for each user in ASP.NET Identity

Related 関連記事

ホットタグ

アーカイブ