Показаны сообщения с ярлыком Config. Показать все сообщения
Показаны сообщения с ярлыком Config. Показать все сообщения

среда, сентября 05, 2007

Комбинированная авторизация в WSS v.3

Задача была - организовать авторизацию пользователей внутренней сети при помощи Windows-авторизации, а для пользователей внешней сети - авторизацию при помощи формы.

Исходная информация тут, тут, тут, тут и кино тут. Почитав всё это (и кое-что ещё), сумел сделать на своей системе (Vista x64, Virtual PC с Windows 2003 и Шарепойнтом) двойную авторизацию с анонимным доступом. Сайты с Windows- и Forms-авторизацией разведены по портам.

Выяснилось, что большинство авторов не обращает внимание на необходимость дать доступ на чтение к базе, в которой будут храниться данные по membership (пользователи, пароли и т.д.), пользователю, под которым функционирует пул приложений Шарепойнта (AppPool в IIS).

Кроме того, в том случае, если используются собственные названия для строки соединения (как в первом источнике) и не делается модификации machine.config, то соответствующий фрагмент web.config надо писать так:

<connectionStrings>
<remove name="LocalSqlServer" />
<add name="LocalSqlServer"
connectionString="server=xxxx;database=AcAspDB;Integrated Security=SSPI;"
providerName="System.Data.SqlClient" />
<add name="AcSqlConnString"
connectionString="server=xxxx;database=AcAspDB;Integrated Security=SSPI;"
providerName="System.Data.SqlClient" />
</connectionStrings>

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

  1. При помощи средств управления сайтом, встроенных в Visual Studio 2005+. Вроде, вполне можно пользоваться, но не ставить же на "боевой" сервер Студию!?smile_omg

  2. При помощи хранимых процедур, имеющихся в базе AcAspDB - aspnet_Membership_CreateUser и др.
  3. При помощи страницы, на которую при помощи Sharepoint Designer установлен стандартный Asp.NET-визард добавления пользователя. Страница может быть помещена, например, в библиотеку на сайте.
  4. При помощи разработки Manage Form Users от stacyDraper, устанавливающей в систему "возможность", которая позволяет редактировать список пользователей и ролей.
Последний способ представляется самым предпочтительным. Немного только изменил скрипт установки (убрал слово bin\ в командах и заменил url-адрес в двух командах на адрес своего сервера), да в файле UserDisp.aspx изменил значение параметра PageSize="5" на 50 - очень уж неудобно работать со списком в 5 позиций.

четверг, января 19, 2006

Application settings in C# 2.0 continued

Обнаружилась засада - не может засады не быть!
 
Для проекта типа "Class Library" можно задать настройки ровно так же, как и для проекта "Application". Разница небольшая - при загрузке сборки чтения конфига не происходит. Даже принудительное перечитывание при помощи settings.Reload(); ничего не прибавляет. Модуль работает с теми значениями настроек, которые были записаны в качестве default'ных.
 
Пришлось написать процедуру считывания значений настроек.

void LoadSettings(ref object settings) {
    PropertyInfo[] props = settings.GetType().GetProperties();
   
string path = this.GetType().Assembly.Location;
   
string cfgpath=path+".config";
   
if (! File.Exists(cfgpath)) return;
   
XmlDocument cfg = new XmlDocument();
   
try {
        cfg.Load(cfgpath);
    }
catch (Exception err) {
        ....
       
return;
    }
   
foreach (PropertyInfo prop in props) {
       
if (!prop.CanWrite) continue;
       
XmlNode setting = cfg.SelectSingleNode("//setting[@name = '" + prop.Name + "']" );
       
object value = "";
        if (setting != null) {
            
try {
                value = setting.SelectSingleNode(
"value").InnerText;
               
prop.SetValue(settings, value, null);
           
} catch { }
        }
    }
}

Использование:

object osettings = new Settings();
LoadSettings(
ref osettings);
settings = (
Settings)osettings;

Примечание. При настройке параметров в VS 2005 область действия (Scope) следует установить User (иначе будет сгенерён класс Settings с readonly свойствами).

воскресенье, января 15, 2006

Settins & Versions

Хорошая вещь Properties.Settings, но не до конца продуманная.
Засада - в хранении пользовательских настроек. Без всяких споров/разговоров сохраняются в файле %USERPROFILE%\Local Settings\Application Data\<Company Name>\<appdomainname>_<eid>_<hash>\<verison>\user.config .
И вот из-за этой <verison> и всё горе - используется значение атрибута assembly:AssemblyVersion , которое у меня обычно выставляется автоматом наподобие "1.0.0.*", что довольно удобно при протоколировании . Но при отладке всё, естественно, корёжится.
Пришлось начать использовать атрибут assembly:AssemblyFileVersionAttribute, который студия (Express, по меньшей мере) автоматом менять не умеет. Для получения версии исполняемого файла пользуюсь процедурой
public static string AnyVersion( Assembly assembly) {
object[] attrs=null;
try{
    attrs=assembly.GetCustomAttributes(
typeof(AssemblyFileVersionAttribute ),false);
}
catch{}
if (attrs != null && attrs.Length > 0) {
   
return ((AssemblyFileVersionAttribute)attrs[0]).Version;
}
return assembly.GetName().Version.ToString(4);
}
 
Использование - AnyVersion(Assembly.GetExecutingAssembly()) или ещё как...

четверг, января 12, 2006

Application settings in C# 2.0

Использование новых возможностей по конфигурированию приложений в VS 2005 применительно к VB.NET описано вот тут.

В C# настройка средствами VS (в т.ч. Express Edition) выполняется точно так же. Отличается, ввиду отсутствия в C# конструкции My.Settings, способ использования этих средств.

В модуле, где необходимо использовать настройки, нужно подключить пространство имён Properties:

using MyProgram.Properties;

В соответствующем классе объявить член класса:

private Settings settings = new Settings();

Поля этого класса уже можно использовать по назначению:

this.Size = settings.MainFormSize;

Замечание.

Такую же операцию следует выполнить во всех использующих настройки модулях (классах, формах и т.п.).