1

EPiServer で実行されている顧客のサイトの一部で、 WIF を使用してユーザーを識別する可能性を調査しています。私は、特に次の投稿を使用して、WIF を有効にすることができました。

http://world.episerver.com/Blogs/Ben-Morris/Dates/2010/6/Converting-EPiServer-6-to-use-claims-based-authentication-with-WIF/

設定すると、これはうまく機能します

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

web.config で、すべてのリクエストに認証済みユーザーが必要になるようにします。ただし、EPiServer を使用して、匿名ユーザーと認証済みユーザーが利用できるコンテンツを分離したいと考えています。問題は、私はそれを機能させることができないということです。

WIF を有効にして を設定しないとdeny users="*"、EPiServer が開始され、WIF が有効になってリダイレクトを実行する前に、いくつかのテキストが応答ストリームに出力されます。

HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Tue, 01 Nov 2011 07:51:04 GMT
Connection: close

Access denied.

</pre></table></table></table></table></table></font></font></font></font></font></i></i></i></i></i></b></b></b></b></b></u></u></u></u></u><p>&nbsp;</p><hr>

これにより、WIF が STS にリダイレクトしようとすると、次のエラーが発生します。

「/」アプリケーションでサーバー エラーが発生しました。

HTTP ヘッダーが送信された後はリダイレクトできません。

説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.Web.HttpException: HTTP ヘッダーが送信された後にリダイレクトできません。

ソース エラー:

現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。

スタックトレース:

[HttpException (0x80004005): HTTP ヘッダーが送信された後にリダイレクトできません
。 ) +249
Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.OnEndRequest(オブジェクト送信者、EventArgs 引数) +438
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68 System.Web.HttpApplication.ExecuteStep(IExecutionStep ステップ, Boolean& completedSynchronously) +75

この動作をオーバーライドできるように、高低の両方を検索しました。EPiServer.dll で、出力内容と同様のテキストを出力する次の場所を見つけました。

AccessDeniedDelegateHandler.cs、メソッドBrowserLogonAccessDenied(object sender):

internal static void BrowserLogonAccessDenied(object sender)
{
  HttpContext.Current.Response.Clear();
  HttpContext.Current.Response.Status = "401 Unauthorized";
  HttpContext.Current.Response.Write("Access denied.");
  HttpContext.Current.Response.Flush();
  HttpContext.Current.Response.End();
}

私が見る限り、このコードは次の 2 つの場所から呼び出されます。

  • EPiServer.Global、 方法protected virtual void HandleAccessDenied()
  • EPiServer.PageBase、 方法public virtual void AccessDenied()

でオーバーライドHandleAccessDeniedして、自分のページ テンプレートでオーバーライドしようとしました。ただし、「アクセスが拒否されました」というテキストは引き続き出力されます。ページ テンプレートのオーバーライドが起動しているように見えますが、オーバーライドは起動していないようです。Global.asaxAccessDeniedAcccessDeniedHandleAccessDenied

ここで何が間違っている可能性があるかについてのヒントはありますか?

4

2 に答える 2

1

問題が見つかりました。AccessDeniedのメソッドをオーバーライドしようとPageBaseしましたが、デフォルトの実装と同じ「間違い」をしました。つまり、応答ストリームをフラッシュしました。

    public override void AccessDenied()
    {
        Response.StatusCode = (int)HttpStatusCode.Unauthorized;
        Response.Flush(); // <- This was the problem
        Response.End();
        // The rest is handled by WIF when we send a HTTP 401, think nothing more of it..
    }

解決策は、単純に応答ストリームのフラッシュを回避することでした。次に、WIF が残りを処理します。

    public override void AccessDenied()
    {
        Response.StatusCode = (int)HttpStatusCode.Unauthorized;
        // Removed the flushing of the response
        Response.End();
        // The rest is handled by WIF when we send a HTTP 401, think nothing more of it..
    }

これにより、EPI の承認を使用して、どのユーザーが各ページにアクセスできるかを制御できます。

于 2011-11-02T08:28:09.277 に答える
0

AccessDeniedの動作をオーバーライドする代わりに、特別なログインフォームを追加して(フォーム認証に依存しているため)、実際にログインをトリガーできます。

public class FederatedLoginHandler : IHttpHandler, IRequiresSessionState
{
    public void ProcessRequest(HttpContext context)
    {
        if (context.User.Identity.IsAuthenticated)
        {
            FormsAuthentication.RedirectFromLoginPage(context.User.Identity.Name, false);
        }
        else
        {
            context.Response.StatusCode = (int)System.Net.HttpStatusCode.Unauthorized;
        }
    }
}

web.configでハンドラーを次のように設定します

<system.webServer>
  <handlers>
    <!--"Fake" login handler, simply triggers WIF auth-->
    <add name="LoginForm" path="federatedlogin.ashx" verb="GET,HEAD" type="SomeAssembly.FederatedLoginHandler" />
    ...

そして最後に、新しいハンドラーを使用するように認証を設定します

<authentication mode="Forms">
  <forms name=".LoginPage" loginUrl="federatedlogin.ashx" timeout="120" />
</authentication>

この戦略では、EPiServer、WIF、または標準のASP.Netの動作を変更する必要はありません。もちろん、これを機能させるには、基本的なWIF構成が必要ですhttp://msdn.microsoft.com/en-us/library/gg638734.aspx

于 2011-11-09T22:28:17.813 に答える