2

私は次の構造を持っています

www.website.com --> ASP.NET 4.0 Web サイト

www.website.com/blog --> NET 4.0、Web アプリケーション

どちらも、同じ SQL データベースに対してフォーム認証を行い、フレームワークの ASP.NET メンバーシップとロールを使用します。各部分に問題なくログインできます (同じユーザー/パスワード) が、認証は引き継がれません。つまり、ログインして へ/のリンクをクリックすると/blog//blog/匿名であると見なされ、再度ログインするように求められます。基本はやりました

すなわち

  1. <authentication mode="Forms">サイトとアプリの web.configs の両方で同一
  2. 同一<machineKey>のセクション (はい、同一のvalidationKeyとdecryptionKey)

次に、生成された Cookie を調べたところ、Web サイトと Web アプリケーションが異なる Cookie で動作しているように見えることがわかりました。

website.com/blog によって作成された Cookie

  • .ASPXFORMSAUTH-27604f05-86ad-47ef-9e05-950bb762570c
  • .ASPXROLES

website.com によって作成された Cookie

  • .ASPXFORMSAUTH

これが問題だと思いますが、<authentication>次のような同一のセクションがあるにもかかわらず表示されます

<authentication mode="Forms">
    <forms timeout="30" slidingExpiration="true" name=".ASPXFORMSAUTH" enableCrossAppRedirects="true" protection="All" cookieless="UseCookies"/>
</authentication>

フォーム認証によるシングル サインオンhttp://msdn.microsoft.com/en-us/library/eb0zx8fc.aspxなどの他の投稿をいくつか読み ました。

他にも思い出せない記事がいくつかありました。私はそれらを(すべて?)見てきましたが、まだ立ち往生しています。必要に応じて、さらに多くのデバッグ データを提供できます。

誰かが持っているかもしれないヒントを本当に感謝します! これで壁にぶち当たると思います!

4

2 に答える 2

2

わかりました、それで、私はそれをより長く打ち負かした後、自分の質問に答えることができました.

基本的に、BlogEngine.NET 2.5 (私の Web アプリ) は、.NET 4.0 フレームワークのやり方をオーバーライドしているようです。修正が必要な点がいくつかあります。すべて、BlogEngine.Core\Security\Security.cs内にあります (BlogEngine.NET ソース コードをダウンロードしてください)。

パート 1: Cookie 名を修正する

次のように変更した FormsAuthCookieName メソッドがあります。

File: BlogEngine.Core\Security\Security.cs
Method: FormsAuthCookieName()
// return FormsAuthentication.FormsCookieName + "-" + Blog.CurrentInstance.Id.ToString();
return FormsAuthentication.FormsCookieName;

これにより、Cookieが同じになります。1つのハードルダウン...

パート 2: web-app/BlogEngine.NET のログイン ページ/コントロール/コードを避ける

ユーザーが BlogEngine.Net の login.aspx (www.website.com\blog\account\login.aspx) にログインするように指示する代わりに、すべてのログイン リンクをメイン Web サイトの login.aspx ページ (www.website.com\login)に向けました。 .aspx)。独自のサイト全体の認証を実装する方法を知りたい場合は、これが超簡単なガイドです

msdn.microsoft.com/en-us/library/ff184050.aspx. 

また、このようなものを Web サイト web.config と Web アプリ web.config の両方に追加する必要があったため、保護されたリソースに (Web サイトまたは Web アプリから) アクセスするたびに、独自のグローバル /login/aspx が使用されます。

<authentication mode="Forms">
<forms timeout="30" loginUrl="/login.aspx" blah blah />
</authentication>

ここで、私自身の汎用的なサイト全体のユーザー ログイン コントロールが、(.NET フレームワーク標準) 認証 Cookie と (ユーザー) ロール Cookie を作成します。BlogEngine.NET の login.aspx を回避することで、クリーンになり、問題のあるこのコードの呼び出しを回避できます。

File: BlogEngine.Core\Security\Security.cs
Method: AuthenticateUser(string username, string password, bool rememberMe)

詳細:このコードは「ブログ インスタンス」を Cookie に追加するため、同じドメインに複数のブログがある場合、ブログ インスタンス 1 で認証された user1 がブログ インスタンス 2 で自動的に認証されないようにします。ドメイン (www.domain.com\blog!) ごとに 1 つのブログしか持たないため、これは不要です。さらに重要なことは、このチェックによってシングル サインオンが中断されることです。

2つのハードルを下...

パート 3: アクセスごとの承認チェックを修正する

現在、サイト全体で標準化されている login.aspx は、特定の BlogEngine.NET インスタンス ID を追加しません (上記を参照)。特にそれを探す BlogEngine.NET コードがまだいくつかあることを除いて、これは問題ありませんでした。そのチェックも必要ないので、問題のあるチェックを削除しましょう...

File: BlogEngine.Core\Security\Security.cs
Method: void Init(HttpApplication context)
// Comment line below to revert to only-framework/default processing
//context.AuthenticateRequest += ContextAuthenticateRequest;

したがって、この時点であなたは持っているべきです

  • 単一のサイト全体の login.aspx によって処理されるすべてのログイン
  • 上記のサイト全体の login.aspx によって作成されたすべての認証 Cookieとユーザー ロール Cookie
  • このようなすべての Cookie は、Web サイトと Web アプリの両方の web.configs (一致する必要があります!) ごとに暗号化および保護されます。

これにより、シングルサインオンが可能になります:) !! 万歳!

于 2011-10-11T05:51:00.133 に答える
1

さらに、両方のweb.configで、同じvalidationKeyと同じdecryptionKeyを持つmachinekeyを挿入する必要があります。

于 2013-01-06T20:39:55.610 に答える