. NET Framework SignalR IPrincipalUser не отображается в контексте Пользователь класса концентратора - PullRequest
0 голосов
/ 08 мая 2020

Я использую SignalR в. Net Framework (не ядро). Я пытаюсь настроить аутентификацию и авторизацию, как описано в руководстве Microsoft здесь: https://docs.microsoft.com/en-us/aspnet/signalr/overview/security/hub-authorization#custom. В настоящее время в моем приложении настроена аутентификация с проверкой имени пользователя и пароля, которая обновляет сеанс (в частности, встроенный в HttpContext.Current.Session). Этот HttpContext.Current.Session недоступен внутри класса концентратора. Хорошо, но пусто. Я хочу полагаться на атрибут авторизации клиента, как описано в связанной документации. Вот код, о котором я говорю:

public class AuthorizeClaimsAttribute : AuthorizeAttribute {
protected override bool UserAuthorized(System.Security.Principal.IPrincipal user)
{
    if (user == null)
    {
        throw new ArgumentNullException("user");
    }

    var principal = user as ClaimsPrincipal;

    if (principal != null)
    {
        Claim authenticated = principal.FindFirst(ClaimTypes.Authentication);
        if (authenticated != null && authenticated.Value == "true")
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    else
    {
        return false;
    }
}
}

Я не могу понять, где инициализировать пользовательский параметр IPrincipal, прежде чем он достигнет вызова метода атрибута. Внутри действия моего контроллера, которое аутентифицирует пользователя по имени пользователя и паролю, я попытался создать идентификатор и принципала и добавить его в текущий поток, как показано в следующем коде:

// Create generic identity.
  GenericIdentity myIdentity = new GenericIdentity("MyIdentity");
  myIdentity.Label = "testlabel";

// Create generic principal.
  String[] myStringArray = { "Manager", "Teller" };
  GenericPrincipal myPrincipal =
  new GenericPrincipal(myIdentity, myStringArray);

// Attach the principal to the current thread.    
Thread.CurrentPrincipal = myPrincipal;

Однако, пока он присоединяется в мою ветку правильно. Он не отображается в параметре настраиваемого атрибута. Куда мне нужно поместить основного пользователя, которого я создаю, чтобы он отображался там в классе хаба и в атрибуте customer?

Для записи, чтобы добавить некоторый контекст к проблеме, я единственный человек, ведущий журнал в и из этого приложения. Таким образом, не будет дублирующихся логинов, которые сбивают параметр с толку. (похоже, что значения по умолчанию для пользователя iprincipal отображаются внутри метода настраиваемого атрибута, если я не ошибаюсь). Я пытаюсь создать очень простое веб-приложение ASP. NET с функцией чата с помощью signalr.

...