アプリケーション全体にわたるフォーム認証
-
09-06-2019 - |
質問
私は会社の内部 Web ベースのツールに取り組んでいます。このツールの一部は、ルート アプリケーションの下の独自の仮想ディレクトリで実行される別のアプリケーション (クルーズ コントロール ダッシュボード) です。
この内部アプリケーションにフォーム認証を設定し、ルート アプリケーションにログイン フォームを用意することで、この内部アプリケーションへのアクセスを制限したいと考えました。
ルート アプリケーションの web.config に次の内容を追加します。
<location path="ccnet">
<system.web>
<authentication mode="Forms">
<forms loginUrl="/default.aspx" timeout="5000"/>
</authentication>
<authorization>
<allow users="?"/>
<deny users="?"/>
</authorization>
</system.web>
</location>
ただし、フォーム認証が機能していないようです。そのアプリケーションに直接アクセスしても、ログイン ページにリダイレクトされません。
<allow> タグと <deny> タグの設定が間違っているような気がします。誰かが明確にしてもらえますか?
解決
<forms タグに path="/" を入れる必要があるかもしれません。申し訳ありませんが、これを行うのは久しぶりです
他のヒント
path="/" を
それはそれでした!
つまり、これを行うには、まとめです。
ルートの web.config に次を追加します。
<machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="SHA1" />
デフォルトでは「AutoGenerate,IsolateApps」になっているため、これを実行する必要があります。
次に、フォーム Auth Cookie に両方で同じ名前を付ける必要があります。私はこれをすべて root で行い、location タグを使用しました。
<authentication mode="Forms">
<forms name="ccAuth" loginUrl="/default.aspx" path="/" timeout="5000"/>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
ついに:
<location path="ccnet">
<system.web>
<authentication mode="Forms">
<forms name="ccAuth" loginUrl="/default.aspx" path="/" timeout="5000"/>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
皆さん、ご協力ありがとうございました。これは大変でした。
FormsAuthentication はユーザーに与えるトークンを暗号化し、デフォルトではアプリケーションごとに異なるキーを暗号化します。Forms Auth をアプリケーション間で機能させるには、次のことを行う必要があります。
まず、フォーム認証の「名前」をすべてのアプリケーションで同じに設定します。これは次のようにして行われます。
<authentication mode="Forms">
<forms name="{name}" path="/" ...>
</authentication>
両方のアプリケーションの web.configs で「名前」を同じに設定します。
次に、暗号化するときに同じキーを使用するように両方のアプリケーションに指示する必要があります。これは少しわかりにくいです。これを設定するとき、私がしなければならなかったのは、両方の web.config に次の内容を追加することだけでした。
<machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="SHA1" />
ドキュメントによると、これがデフォルト値ですが、指定しない限り機能しませんでした。
これは機能しませんが、依然としてすべてのユーザー (認証済みかどうかに関係なく) にアクセスが許可されます。
冗長なので、allow タグを省略してもよいと思います。ただ:
<deny users="?"/>
ジョナサン、そのコードはどこにありますか?私の経験では、ログイン コントロールがあり、OnAuthenticate イベントで Authenticated を false に設定します。
If CustomAuthenticate(Login1.UserName, Login1.Password) Then
FormsAuthentication.RedirectFromLoginPage(Login1.UserName, False)
Else
e.Authenticated = False
End If
しかし、それは マイクロソフトのやり方
すべての未認証を許可しています。あなたはこのようなものを探しているかもしれません
<deny users="?"/>
このクルーズ コントロール アプリケーションのファイル拡張子は何ですか?ASP.NET が処理するように登録されているファイルの種類ではない場合 (例:jsp、java など)、ASP.NET は (IIS 5 および 6 では) 認証メカニズムとして機能しません。たとえば、静的 HTML ファイルの場合、ワイルドカード マッピングが実装されていない限り、IIS がすべての認証と承認を実行し、ASP.NET isapi 拡張機能を使用せずにファイルを提供します。IIS7 は、新しい統合パイプライン モードを使用して、すべての要求をインターセプトできます。IIS6 の場合は、以下を参照してください。 この問題に関する Scott Gu の記事.
上記の提案はどれも私にとっては役に立ちませんでした。ルートの web.config セットで次のようになります。
<forms loginUrl="/pages/login.aspx" enableCrossAppRedirects="true"...
ルートアプリと子アプリの両方が system.web にあることを確認してください。
<machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="SHA1"/>
これにより、IsolateApps のデフォルトがオフになります。
その後、すべてがうまくいきました。