Как задать многоязычное имя роли PrincipalPermission?
-
03-07-2019 - |
Вопрос
Я пытаюсь защитить службу WCF с помощью учетных записей Windows.Служба должна работать во многих системах с разными языками.Как я могу установить PrincipalPermission, у которого имена ролей не зависят от языка?
Я нашел уродливые обходные пути, подобные этому.
[PrincipalPermission(SecurityAction.Demand, Role = "Builtin\\Administrators")] // English
[PrincipalPermission(SecurityAction.Demand, Role = "Vordefiniert\\Administratoren")] // German
public string HelloWorld()
{
return "Hello";
}
Я не думаю, что это хорошее решение, есть ли какой-нибудь способ сделать этот язык независимым?Есть ли способ использовать SID учетной записи вместо строки?
Решение
Еще одна попытка:Взгляните на http://msdn.microsoft.com/en-us/library/system.security.principal.windowsbuiltinrole.aspx ....и переходим к образцу .Там вы можете использовать встроенные элементы перечисления, чтобы получить правильно написанное имя группы (через API)...тогда оно должно быть нейтральным по отношению к языку.
HTH, Томас
Другие советы
Вы можете свернуть свой собственный атрибут разрешения, который обрабатывает перевод:
[Serializable, AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true, Inherited = false), ComVisible(true)]
public sealed class AdministratorPrincipalPermissionAttribute : CodeAccessSecurityAttribute
{
public AdministratorPrincipalPermissionAttribute(SecurityAction action) : base(action)
{ }
public override IPermission CreatePermission()
{
var identifier = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
var role = identifier.Translate(typeof(NTAccount)).Value;
return new PrincipalPermission(null, role);
}
}
Обратите внимание, что это потребует дополнительных усилий по развертыванию (gac, caspol и т. д.).
Вы можете использовать императивную версию и динамически преобразовывать нейтральную для языка форму (например, SID) в локализованную форму (может быть через SecurityIdentifier.Translate).
Хорошо известные идентификаторы безопасности перечислены в KB 243330.
Хм, я бы не использовал имя группы непосредственно в своем коде (жестко закодировано). Попробуйте абстрагироваться от такой роли, как " HelloWorldAdmin " и иметь роль, настроенную в app.config. Этот должен быть сопоставлен с группой пользователей. Это позволит вашим пользователям / администраторам выбрать группу и сопоставить ее с ролью (например, в случае, если администраторы приложения не являются администраторами AD). Посмотрите на http://msdn.microsoft.com/en-us/ библиотека / ms998314.aspx . НТН.
Вы абсолютно уверены, что в немецкоязычной системе "BUILTIN \Administrators" не будет работать?Я бы предположил, что даже тогда эти основные названия групп должны быть действительными.Да, в ваших инструментах администрирования он покажет "Vordefiniert \ ADministratoren" - но я был бы удивлен, если атрибут PrincipalPermission будет зависеть от языка.
Марк