質問

私は会社の内部 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 のデフォルトがオフになります。

その後、すべてがうまくいきました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top