Является ли код класса stati c безопасным / поточно-ориентированным при доступе со страницы? - PullRequest
0 голосов
/ 09 марта 2020

Я ценю, что этот тип вопроса задавался до смерти, но чем больше я читаю на SO, тем больше я запутался, поэтому был бы признателен за ответ да / нет и соответствующее объяснение, основанное на следующем коде. Я протестировал код, и он работает, но я ищу немного общей мудрости, потому что я не могу имитировать одновременные запросы доступа.

В моем веб-приложении база данных имеет учетные записи пользователей из нескольких организаций. Цель кода - получить некоторые учетные данные для доступа, указывающие c в их соответствующую организацию , а затем интегрировать их с системой стороннего производителя, используя объект, созданный с использованием этих учетных данных.

Есть ли любая вероятность ниже того, что пользователь может подвергнуться действию учетных данных другой организации, если несколько человек ударили это одновременно, в частности:

  1. Потеряна ли безопасность потока страницы при доступе к коду stati c ?
  2. Может ли код 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));
        }

    }
...