2013-06-12 3 views
0

Я знаю, что вызывает цикл Redirect в моем коде, я просто не знаю, как его исправить. Во-первых, мой код.Решение Redirect Loop

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"); 
    } 
} 

Точка кода является первой проверки для строки запроса в методе ПЕРЕКЛЮЧАТЕЛЬ() в случае, если один предусмотрен на следующей странице. Затем он захватывает текущее имя пользователя AD, входящее в систему, а затем проверяет базу данных пользователя, чтобы увидеть, отмечен ли пользователь Active. Если это так, он ничего не делает, так как это позволит загружать страницу как обычно. Если нет, то он перенаправляется на ту же страницу, но добавляет Error_ID, чтобы я мог отображать другой вид, говорящий, что пользователь не имеет доступа. Я почти уверен, что это то, откуда происходит цикл переадресации. Есть ли у кого-нибудь идеи о том, как я могу устранить Redirect Loop? Я попытался сделать Request.Url.ToString(), а затем !var.Contains, чтобы сделать Перенаправление, но я тоже не смог выполнить эту работу.

EDIT: Я должен отметить, что мне интересно узнать, есть ли у кого-либо альтернативы Response.Redirect(). Он работает, но изначально я использовал Response.End() и не позволял запускать какой-либо код, поэтому придумал Response.Redirect() и QueryString, чтобы делать то, что я хотел.

ответ

1

Вы тестируете, если ваш пользователь активен дважды. Кроме того, во второй проверке вы продолжаете перенаправлять страницу самому себе, которая продолжает делать проверки.

Ваш первый чек здесь:

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

и ваш второй чек здесь:

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», то есть вы можете либо:

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, то есть изменить свой второй чек:

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"); 
    } 
} 

ИМХО, решение 2 кажется быть cl eanest и самый элегантный из двух

+0

Идеально и так просто. Спасибо. Я тоже пошел с решением 2. И спасибо за объяснение. Я знал, что именно там возникла проблема, но не понял, как и почему. – Trido

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"); 
     } 
    } 
    } 
} 
1

Вам нужно только выполнить проверку базы данных, если значение строки запроса (error_ID) не 1 или 2. Способ, логика написана, вы всегда будете проверять, активен или нет пользователь, а если нет, то он будет продолжать отправлять значение строки запроса Error_ID = 2 на страницу, и вы будете застревать в цикле. Я бы рекомендовал отделить логику, чтобы протестировать строку запроса в отдельный метод и вернуть ей логическое значение: пытаться или нет пытаться запросить базу данных для значения Active.

+0

Я бы рекомендовал, чтобы ваш текущий метод был разделен на три отдельных метода; HandleQueryString, GetCurrentUserName и IsUserActive.Вы делаете слишком много в своем единственном методе здесь, и это, вероятно, является частью путаницы в том, как исправить это. Разделив вашу логику, она позволяет разбить функциональность на части и потенциально повторно использовать логику в другом месте. Например, вы можете иметь логику базы данных на уровне доступа к данным (DAL), а затем другие страницы .aspx могли бы использовать этот метод IsUserActive, если это необходимо. –