Я ценю, что этот тип вопроса задавался до смерти, но чем больше я читаю на SO, тем больше я запутался, поэтому был бы признателен за ответ да / нет и соответствующее объяснение, основанное на следующем коде. Я протестировал код, и он работает, но я ищу немного общей мудрости, потому что я не могу имитировать одновременные запросы доступа.
В моем веб-приложении база данных имеет учетные записи пользователей из нескольких организаций. Цель кода - получить некоторые учетные данные для доступа, указывающие c в их соответствующую организацию , а затем интегрировать их с системой стороннего производителя, используя объект, созданный с использованием этих учетных данных.
Есть ли любая вероятность ниже того, что пользователь может подвергнуться действию учетных данных другой организации, если несколько человек ударили это одновременно, в частности:
- Потеряна ли безопасность потока страницы при доступе к коду stati c ?
- Может ли код stati c вернуть значение неправильному потоку при использовании, как в моем примере?
Logi-класс класса приложения c
public static class ThirdParty
{
public class ThirdPartyCredentials
{
public string AppId { get; set; }
public string AppSecret { get; set; }
}
// Retrieves the third-party system credentials for the current user's organisation
public static ThirdPartyCredentials GetThirdPartyCloudCredentials()
{
ThirdPartyCredentials cc = new ThirdPartyCredentials();
// This usually happens in business logic, but example shown here to illustrate UserId/OrganisationId come from user-based OWIN/Katana cookies
var user = HttpContext.Current.Request.GetOwinContext().Authentication.User;
var sqlCommand = new SqlCommand();
sqlCommand.Parameters.Add("@UserId", SqlDbType.Int, Convert.ToInt32(user.FindFirst("UserId").Value));
sqlCommand.Parameters.Add("@OrganisationId", SqlDbType.Int, Convert.ToInt32(user.FindFirst("OrganisationId").Value));
// Code removed from brevity, but returns a DataTable object containing the credentials
using (DataTable dt = ....)
{
cc.AppId = dt.Rows[0]["ThirdPartyAppId"].ToString();
cc.AppSecret = dt.Rows[0]["ThirdPartyAppSecret"].ToString();
return cc;
}
}
public static ApiClient GetApiClient()
{
var creds = GetThirdPartyCloudCredentials();
return new ApiClient()
{
Username = creds.AppId,
Password = creds.AppSecret
};
}
}
Page Logi c
protected void Page_Load(object sender, EventArgs e)
{
var apiClient = GetApiClient();
var dataApi = new ThirdPartySystem.DataApi() {
ApiClient = apiClient;
};
foreach (var c in dataApi.GetData().ObjectCollection)
{
MyDropDownList.Items.Add(new ListItem(c.Title, c.Id));
}
}