2

Windows Azure ACS によって保護された特定の領域を持つ ASP.NET MVC サイトを作成しようとしています。デフォルト エリアは保護しない (つまり、匿名ユーザーを許可する) 必要がありますが、サブ エリアのみを保護します。

Web.config の system.web セクションから認証要素を削除することで、これを実現しました。

<authorization>
     <deny users="?" />
</authorization>

次に、目的の MVC3 領域の保護された場所を追加します。

<location path="MyArea">
    <system.web>
        <authorization>
            <deny users="?" />
        </authorization>
    </system.web>
</location>

ただし、IClaimsIdentity にアクセスし、処理のために属性を取得していた古いコードは、Global.asax の Session_Start イベントに存在していました。サイトがデフォルト領域にアクセスするために認証を必要としないため、認証が行われずに Session_Start が発生します。

WIF の認証イベントを処理するために、どのイベントを関連付けることができますか?

SessionAuthenticationModule_SessionSecurityTokenReceived を使用してスライディング セッション タイムアウトを実装し、OnPostAuthenticationRequest イベントにユーザー分析ロジックを追加しようとしましたが、役に立ちませんでした。

最初に次のイベントに接続した後、ユーザーを取得できました。

FederatedAuthentication.ServiceConfigurationCreated

次に、このイベント内でこのイベントに接続します。

FederatedAuthentication.WSFederationAuthenticationModule.SignedIn

ただし、このイベント内ではセッションは null であり、session_start が再度呼び出されることはありません。そのため、ID プロバイダーにリダイレクトするときにセッションがクラッシュしているようです。

anon -> Application_start
anon -> Session_start
anon -> /MyArea
anon に移動 -> ACS にリダイレクト -> idP
anon にリダイレクト -> ログイン
認証 -> /MyArea
auth にリダイレクト -> FederatedAuthentication.WSFederationAuthenticationModule.SignedIn が発生するが、セッション無効です!

更新: セッションと認証の両方が存在する場所がまだ見つかりません。Unity を使用してオンデマンドでユーザーを検出しています。それが起こったときにそれを行うイベントがあればいいのですが、私の回避策はまだ機能しています。

4

2 に答える 2

3

ロジックをいつどのように実行するか (ログイン後、セッション トークンの作成時、受信後) に応じて、いくつかのオプションがあります。SessionAuthenticationModule_SessionSecurityTokenReceivedイベントは正しく機能するはずですが、サブスクライブするのは難しい場合があります。これはあなたがそれを行う方法です:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        ...

        FederatedAuthentication.FederationConfigurationCreated += (s, e) =>
        {
            FederatedAuthentication.SessionAuthenticationModule.SessionSecurityTokenCreated += SessionAuthenticationModule_SessionSecurityTokenCreated;
            FederatedAuthentication.SessionAuthenticationModule.SessionSecurityTokenReceived += SessionAuthenticationModule_SessionSecurityTokenReceived;
            FederatedAuthentication.WSFederationAuthenticationModule.SessionSecurityTokenCreated += WSFederationAuthenticationModule_SessionSecurityTokenCreated;
            FederatedAuthentication.WSFederationAuthenticationModule.SecurityTokenValidated += WSFederationAuthenticationModule_SecurityTokenValidated;
            FederatedAuthentication.WSFederationAuthenticationModule.SecurityTokenReceived += WSFederationAuthenticationModule_SecurityTokenReceived;
            FederatedAuthentication.WSFederationAuthenticationModule.SignedIn += WSFederationAuthenticationModule_SignedIn;
        };
    }

    void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e)
    {
        Debugger.Break();
    }

    void SessionAuthenticationModule_SessionSecurityTokenCreated(object sender, SessionSecurityTokenCreatedEventArgs e)
    {
        Debugger.Break();            
    }

    void WSFederationAuthenticationModule_SessionSecurityTokenCreated(object sender, SessionSecurityTokenCreatedEventArgs e)
    {
        Debugger.Break();            
    }

    void WSFederationAuthenticationModule_SecurityTokenValidated(object sender, SecurityTokenValidatedEventArgs e)
    {
        Debugger.Break();            
    }

    void WSFederationAuthenticationModule_SecurityTokenReceived(object sender, SecurityTokenReceivedEventArgs e)
    {
        Debugger.Break();            
    }

    void WSFederationAuthenticationModule_SignedIn(object sender, EventArgs e)
    {
        Debugger.Break();     
    }
}

このコードはすべて Global.asax ファイルに格納され、FederationConfigurationCreated イベントが発生した後にイベントを設定する必要があります (これは、SessionAuthenticationModule と WSFederationAuthenticationModule が使用可能になるときです)。各イベント ハンドラーに Debugger.Break を追加しました。それらをそのままにして、アプリケーションをデバッグして、各イベントがいつトリガーされるかを確認します。これにより、いつどこにロジックを追加するかを決定できます。

于 2012-12-18T20:00:48.527 に答える
0

保護するコントローラー/アクションで [Authorize] 属性を使用します。

[Authorize]
public ActionResult Index()
{
    return View();
}
于 2012-12-18T19:53:04.377 に答える