3

現在、WebSeal リバース プロキシの背後で .Net Web アプリケーションとして実行されるソリューションを設計しています。

ビューステートの書き換えなど、人々がこれにさまざまな問題を抱えているネット上のコメントを見てきました。

質問: この技術の組み合わせを実装して動作させた人はいますか?

4

2 に答える 2

8

WEBSEAL の背後で動作する ASP.NET アプリケーションを作成しました。多くの研究と開発とテストの後、それは機能します。

あなたに役立ついくつかの問題を提案します:

IIS と ASP.NET は大文字と小文字を区別しません

("...Login.aspx" と "...login.aspx" はどちらも同じページにつながります); デフォルトでは、webseal は大文字と小文字を区別します。そのため、WEBSEAL ジャンクションを大文字と小文字を区別しないように設定するか、単一のリンク (ページ、JavaScript、画像) をチェックする必要があります。

サーバーの相対 URLとして記述された内部リンクは提供されません

WEBSEAL は、アプリケーションを参照するすべてのリンクを変更しますが、他のアプリケーションへのリンクは変更しません。アプリケーションの相対 URL ではなくサーバーの相対 URLとして記述された内部リンクは変更されず (WEBSEAL はそれが同じアプリケーションであることを認識しません)、提供されません (WEBSEAL は変更されていないリンクを拒否します)。 最初のルールは、単一のリンクをチェックし、それをアプリケーションの相対 URL にすることです。 レンダリングされた HTML を見てください : これはサーバーの相対 URL であり、問​​題があります。 使用する場合はコード ビハインドを参照してください。ORを使う とまずい。

<.. href=/ anything>
"= ~/ anything""= / anything"ResolveUrl(..)

しかし、これだけでは不十分です。AJAX は、大量の JavaScript とコードをScriptResource.axdWebResource.axd内に配置し、サーバーの相対 URL を作成してリンクします。このリンクはプログラマーによって制御されないため、簡単に変更する方法はありません。
簡単な解決策 (可能な場合): WEBSEAL ジャンクションを透過的に設定する問題を解決します。
難しい解決策:次のコードを書いてください(この回答に感謝します)

protected void Page_Load(object sender, EventArgs e)
    {
        //Initialises my dirty hack to remove the leading slash from all web reference files.
        Response.Filter = new WebResourceResponseFilter(Response.Filter);
    }

public class WebResourceResponseFilter : Stream
{
    private Stream baseStream;

    public WebResourceResponseFilter(Stream responseStream)
    {
        if (responseStream == null)
            throw new ArgumentNullException("ResponseStream");
        baseStream = responseStream;
    }

    public override bool CanRead
    { get { return baseStream.CanRead; } }

    public override bool CanSeek
    { get { return baseStream.CanSeek; } }

    public override bool CanWrite
    { get { return baseStream.CanWrite; } }

    public override void Flush()
    { baseStream.Flush(); }

    public override long Length
    { get { return baseStream.Length; } }

    public override long Position
    {
        get { return baseStream.Position; }
        set { baseStream.Position = value; }
    }

    public override int Read(byte[] buffer, int offset, int count)
    { return baseStream.Read(buffer, offset, count); }

    public override long Seek(long offset, System.IO.SeekOrigin origin)
    { return baseStream.Seek(offset, origin); }

    public override void SetLength(long value)
    { baseStream.SetLength(value); }

    public override void Write(byte[] buffer, int offset, int count)
    {
        //Get text from response stream.
        string originalText = System.Text.Encoding.UTF8.GetString(buffer, offset, count);

        //Alter the text.
        originalText = originalText.Replace(HttpContext.Current.Request.ApplicationPath + "/WebResource.axd",
            VirtualPathUtility.MakeRelative(HttpContext.Current.Request.Url.AbsolutePath, "~/WebResource.axd"));
        originalText = originalText.Replace(HttpContext.Current.Request.ApplicationPath + "/ScriptResource.axd",
            VirtualPathUtility.MakeRelative(HttpContext.Current.Request.Url.AbsolutePath, "~/ScriptResource.axd"));

        //Write the altered text to the response stream.
        buffer = System.Text.Encoding.UTF8.GetBytes(originalText);
        this.baseStream.Write(buffer, 0, buffer.Length);

    }

これにより、ページへのストリームがインターセプトされ、「/WebResource.axd」または「ScriptResource.axd」の出現箇所がすべて「../../WebResource.axd」および「../../ScriptResource.axd」に置き換えられます。

実際の WEBSEAL ユーザーを取得するためのコードを開発する

WEBSEAL は、ユーザー名をHTTP_IV_USER内に配置するように構成されています。プログラムで読み取るWebseal\Login.aspxフォームを作成しました。ここで、このユーザーを CurrentUser にするために、隠しasp.Loginを配置します。

<span style="visibility:hidden"> 
<asp:Login ID="Login1" runat="server" DestinationPageUrl="~/Default.aspx">..

プログラムでボタンをクリックしました

protected void Page_Load(object sender, EventArgs e)
{
    string username = Request.ServerVariables["HTTP_IV_USER"];
    (Login1.FindControl("Password") as TextBox).Text = MyCustomProvider.PswJump;
    if (!string.IsNullOrEmpty(username))
    {
        (Login1.FindControl("UserName") as TextBox).Text = username;
        Button btn = Login1.FindControl("LoginButton") as Button;
        ((IPostBackEventHandler)btn).RaisePostBackEvent(null);
     }
    else
    {
        lblError.Text = "Login error.";
    }
}

LoginButtonが起動すると、アプリケーションは UserName (WEBSEAL 変数から設定) とパスワード (ハードコーディング) を読み取ります。そこで、ユーザーを検証して現在のプリンシパルを設定するカスタム メンバーシップ プロバイダーを実装しました。

web.config の変更

loginUrlは、FormsAuthentication クラスがリダイレクトするログイン ページの URL です。WEBSEAL ポータルに設定されています。認証されていないユーザーとログアウト ボタンはポータルにリダイレクトされます。

<authentication mode="Forms">
  <forms loginUrl="https://my.webseal.portal/" defaultUrl="default.aspx"...."/>
</authentication>

Webseal/login.aspxはデフォルトのログイン ページではないため、認証タグは認証されていないユーザーにアクセスを許可します。

<location path="Webseal/login.aspx">
    <system.web>
        <authorization>
            <allow users="*"/>
        </authorization>
    </system.web>
</location>

アプリケーションは、カスタム メンバーシップ プロバイダーを使用するように設定されています。

 <membership defaultProvider="MyCustomMembershipProvider">
  <providers>
    <add name="MyCustomMembershipProvider" type="MyNamespace.MyCustomMembershipProvider" connectionStringName="LocalSqlServer"/>
  </providers>
</membership>
<roleManager enabled="true" defaultProvider="MyCustomRoleProvider">
  <providers>
    <add name="MyCustomRoleProvider" type="MyNamespace.MyCustomRoleProvider" connectionStringName="LocalSqlServer"/>
  </providers>
</roleManager>

デバッグはオフに設定されています:

<compilation debug="false" targetFramework="4.0">

それはすべての人々です!

于 2011-09-07T11:54:52.770 に答える
2

WebSeal 経由でアクセスすると、ASP.Net アプリに最初に問題が発生しました。開発サーバーでサイトを実行していました。私にとってうまくいったのは、構成ファイルでデバッグをオフにしてアプリケーションをデプロイすることでした。

<compilation debug="false" ...>

デバッグをオンにすると、サイトに直接アクセスすると正常に動作するが、WebSeal を介してアクセスすると失敗する AJAX 呼び出しがいくつかありました。デバッグをオフにすると、すべて正常に動作します。

また、WebSeal は匿名認証を必要とするため、Windows 認証を使用することはできませんでした。

于 2010-12-21T21:15:38.060 に答える