2013-04-08 2 views
9

Я искал реализацию именованного канала для связи службы/клиента в .NET и столкнулся с this code, который, хотя инициализация серверной части канала должна была создать дескриптор безопасности для этого канала. Они сделали это так:Локализация для идентификации безопасности в .NET

PipeSecurity pipeSecurity = new PipeSecurity(); 

// Allow Everyone read and write access to the pipe. 
pipeSecurity.SetAccessRule(new PipeAccessRule("Authenticated Users", 
    PipeAccessRights.ReadWrite, AccessControlType.Allow)); 

// Allow the Administrators group full access to the pipe. 
pipeSecurity.SetAccessRule(new PipeAccessRule("Administrators", 
    PipeAccessRights.FullControl, AccessControlType.Allow)); 

Но я смотрю на него, и я обеспокоен указанием SIDs как строки, или Authenticated Users и Administrators частей. Какова гарантия того, что они будут называться так, например, на китайском или другом языке?

+0

OK. Я сам это подтвердил. Кажется, это работает. – ahmd0

+5

Вы должны рассмотреть возможность разделения этого вопроса на правильную пару вопросов/ответов. – slugster

+0

Да, вы можете ответить на свой вопрос. – DWright

ответ

0

(Выдержки из первоначального вопроса ФП в)

Я придумал эту альтернативу:

PipeSecurity pipeSecurity = new PipeSecurity(); 

// Allow Everyone read and write access to the pipe. 
pipeSecurity.SetAccessRule(new PipeAccessRule(
    "Authenticated Users", 
    new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null), 
    PipeAccessRights.ReadWrite, AccessControlType.Allow)); 

// Allow the Administrators group full access to the pipe. 
pipeSecurity.SetAccessRule(new PipeAccessRule(
    "Administrators", 
    new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null), 
    PipeAccessRights.FullControl, AccessControlType.Allow)); 
+0

Это не работает для меня, нет перегрузки, которая берет строку и «SecurityIdentifier», [см. Здесь] (https://msdn.microsoft.com/en-us/library/system.io.pipes. pipeaccessrule.pipeaccessrule (v = vs.110) .aspx). Удалите строковые литералы '' Authenticated Users "и' "Administrators". – doug65536

2

Вы можете использовать WellKnownSidType перечисление, чтобы получить SID и перевести в IdentityReference:

 var sid = new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null); 
     var everyone = sid.Translate(typeof(NTAccount)); 
     security.AddAccessRule(new PipeAccessRule(everyone, PipeAccessRights.ReadWrite, AccessControlType.Allow)); 
+1

«Все» - отличная идея. Вероятно, вам нужен хотя бы «WellKnownSidType.AuthenticatedUserSid». Есть ли определенная причина, по которой вы используете «WorldSid» (Everyone), кроме паранойи, что она может не работать? – doug65536

+0

Точно! Изменено. –

+1

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

Смежные вопросы