0

コードでリダイレクト ループが発生している原因はわかっていますが、修正方法がわかりません。まず、私のコード。

switch (Request.QueryString["Error_ID"])
{
    case "1":
        // Error Code 1 is when a user attempts to access the Admin section and does not have rights to.
        MultiView1.ActiveViewIndex = 1;
        break;
    case "2":
        // Error Code 2 is when a user is not currently Active.
        MultiView1.ActiveViewIndex = 2;
        break;
    default:
        // Default is View Index 0 for default access.
        MultiView1.ActiveViewIndex = 0;
        break;
}

// Get current username.
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

// Test to see if user is Active.
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["HSEProjRegConnectionString1"].ConnectionString))
{
    conn.Open();
    using (SqlCommand cmd = new SqlCommand("SELECT [active] FROM [tbl_Person] WHERE username LIKE @username", conn))
    {
    cmd.Parameters.AddWithValue("@username", "%" + userName + "%");

    var res = cmd.ExecuteScalar();
    bool registeredAndActive = (bool)res;

    if (registeredAndActive)
    {
        // Active Condition. The DEFAULT in SWITCH() will take care of displaying content.
    }
    else
    {
        // !Active Condition.  Shows an alternative version of the default page where the user is told they do not have access.
        Response.Redirect("default.aspx?Error_ID=2");
    }
}

コードのポイントは、後のページでクエリ文字列が提供された場合に備えて、まず SWITCH() メソッドでクエリ文字列をチェックすることです。次に、ログインしている現在の AD ユーザー名を取得し、ユーザー データベースをチェックして、ユーザーがアクティブとマークされているかどうかを確認します。その場合、ページを通常どおりロードできるため、何もしません。そうでない場合は、同じページにリダイレクトしますが、Error_ID を追加して、ユーザーにアクセス権がないことを示す別のビューを表示できるようにします。これがリダイレクトループの原因であると確信しています。Redirect Loop を排除する方法について何か考えがある人はいますか? a を実行してから、リダイレクトを実行しようとしましたがRequest.Url.ToString()、それも!var.Contains機能しませんでした。

編集:誰かが に代わるものを持っているかどうか聞いてみたいことに注意してくださいResponse.Redirect()。それは機能しますが、もともと私は and を使用Response.End()していましたが、それではコードの実行が許可されなかったので、私がやりたいことを行うためにResponse.Redirect()andを使用することにしました。QueryString

4

3 に答える 3

1

ユーザーが2 回アクティブかどうかをテストしています。また、2 番目のチェックでは、ページをそれ自体にリダイレクトし続け、チェックを続けます。

あなたの最初のチェックはここにあります:

switch (Request.QueryString["Error_ID"])
{
(...)
case "2":
    // Error Code 2 is when a user is not currently Active.
    MultiView1.ActiveViewIndex = 2;
    break;
(...)

2 番目のチェックは次のとおりです。

    if (registeredAndActive)
    {
        // Active Condition. The DEFAULT in SWITCH() will take care of displaying content.
    }
    else
    {
        // !Active Condition.  Shows an alternative version of the default page where the user is told they do not have acces.
        Response.Redirect("default.aspx?Error_ID=2");
    }

そのため、2 番目のチェックはページをそれ自体にリダイレクトし、永久にループし続けます。

これを修正する最も簡単な方法は、私見ですが、エラーコードが「2」の場合、現在のユーザーがアクティブかどうかを確認しないことです。つまり、次のいずれかを実行できます。

1) Error_ID が 2 の場合、ページの実行を停止します。つまり、最初のチェックを次のように変更します。

case "2":
  // Error Code 2 is when a user is not currently Active.
  MultiView1.ActiveViewIndex = 2;
  Response.End(); // <--- this will stop the execution before reaching the first block
  break;

2) Error_ID が 2 の場合、ページを再度リダイレクトしないでください。つまり、2 番目のチェックを次のように変更します。

if (registeredAndActive)
{
    // Active Condition. The DEFAULT in SWITCH() will take care of displaying content.
}
else
{
    // !Active Condition.  Shows an alternative version of the default page where the user is told they do not have acces.

    if (MultiView1.ActiveViewIndex != 2) { // check if the page has already been redirected
      Response.Redirect("default.aspx?Error_ID=2");
    }
}

IMHO、ソリューション 2 は、2 つの中で最もクリーンでエレガントなようです

于 2013-06-12T00:25:45.613 に答える
1

次のようにしてみてはどうでしょうか。

if(MultiView1.ActiveViewIndex != 2)
{
  using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["HSEProjRegConnectionString1"].ConnectionString))
  {
    conn.Open();
    using (SqlCommand cmd = new SqlCommand("SELECT [active] FROM [tbl_Person] WHERE username LIKE @username", conn))
    {
      cmd.Parameters.AddWithValue("@username", "%" + userName + "%");

      var res = cmd.ExecuteScalar();
      bool registeredAndActive = (bool)res;

      if (registeredAndActive)
      {
        // Active Condition. The DEFAULT in SWITCH() will take care of displaying content.
      }
      else
      {
        // !Active Condition.  Shows an alternative version of the default page where the user is told they do not have acces.
        Response.Redirect("default.aspx?Error_ID=2");
      }
    }
  }
}
于 2013-06-12T00:26:32.840 に答える
1

クエリ文字列値 (Error_ID) が 1 または 2 でない場合にのみ、データベース チェックを実行する必要があります。ロジックの記述方法では、ユーザーがアクティブかどうかを常にチェックし、アクティブでない場合は、 Error_ID=2 クエリ文字列値をページに送信し続けると、ループに陥ります。クエリ文字列をテストするロジックを別のメソッドに分離し、Active 値についてデータベースにクエリを実行するかどうかのブール値を返すようにすることをお勧めします。

于 2013-06-12T00:27:35.460 に答える