Идентификационные данные набора потока

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

24
задан Jeff 29 December 2014 в 17:58
поделиться

2 ответа

Можно установить Идентификационные данные потока путем создания нового Принципала. Можно использовать любые Идентификационные данные, которые наследовались от Система. Безопасность. Принципал. IIdentity, но Вам нужен класс, который наследовался от Система. Безопасность. Принципал. IPrincipal, который берет тип Идентификационных данных, которые Вы используете.
Для пользы простоты.Net платформа обеспечивает GenericPrincipal и классы GenericIdentity , которые могут использоваться как это:

 using System.Security.Principal;

 // ...
 GenericIdentity identity = new GenericIdentity("M.Brown");
 identity.IsAuthenticated = true;

 // ...
 System.Threading.Thread.CurrentPrincipal =
    new GenericPrincipal(
        identity,
        new string[] { "Role1", "Roll2" }
    );

 //...
 if (!System.Threading.Thread.CurrentPrincipal.IsInRole("Roll1"))
 {
      Console.WriteLine("Permission denied");
      return;
 }

Это однако не даст Вам права окон наполнить использование новых идентификационных данных. Но может быть полезно, если Вы разрабатываете веб-сайт и хотите создать свое собственное управление пользователями.

, Если Вы хотите симулировать быть различным пользователем Windows, чем учетная запись, Вы в настоящее время используете тогда, необходимо использовать олицетворение. Пример того, как сделать это, может быть найден в Справке для Система. Безопасность. Принципал. WindowsIdentity. Явитесь олицетворением () . Существуют ограничения, о которых учетных записях учетная запись Вы работаете под, может явиться олицетворением.

В некоторых случаях.Net платформа делает олицетворение для Вас. Один пример того, где это происходит, - то, если Вы разрабатываете веб-сайт ASP.NET, и Вы Интегрировали аутентификацию Windows, включенную для виртуального каталога или сайта, в котором Вы работаете.

29
ответ дан Hakan Fıstık 28 November 2019 в 23:49
поделиться

Да, с помощью олицетворение буквально

using (new Impersonation())
{
    // your elevated code
}

и класс следующим образом для настроек, я использую адаптер словаря замка, если это выглядит странным.

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
public class Impersonation : IDisposable
{
    private readonly SafeTokenHandle _handle;
    private readonly WindowsImpersonationContext _context;

    //const int Logon32LogonNewCredentials = 9; 
    private const int Logon32LogonInteractive = 2;

    public Impersonation()
    {
        var settings = Settings.Instance.Whatever;
        var domain = settings.Domain;
        var username = settings.User;
        var password = settings.Password;
        var ok = LogonUser(username, domain, password, Logon32LogonInteractive, 0, out _handle);
        if (!ok)
        {
            var errorCode = Marshal.GetLastWin32Error();
            throw new ApplicationException(string.Format("Could not impersonate the elevated user.  LogonUser returned error code {0}.", errorCode));
        }
        _context = WindowsIdentity.Impersonate(_handle.DangerousGetHandle());
    }

    public void Dispose()
    {
        _context.Dispose();
        _handle.Dispose();
    }

    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    private static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, out SafeTokenHandle phToken);

    public sealed class SafeTokenHandle : SafeHandleZeroOrMinusOneIsInvalid
    {
        private SafeTokenHandle()
            : base(true)
        { }

        [DllImport("kernel32.dll")]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
        [SuppressUnmanagedCodeSecurity]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool CloseHandle(IntPtr handle);

        protected override bool ReleaseHandle()
        {
            return CloseHandle(handle);
        }
    }
}
3
ответ дан Hakan Fıstık 28 November 2019 в 23:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: