SignalR ISAаутентифицирован с использованием заголовков

Моя цель: использовать пользовательские заголовки с моим собственным токеном для аутентификации пользователя или машины в моей службе сигналов.

Мы успешно использовали эту методологию в ASP.net WEB API для выполнения нашей собственной проверки подлинности и авторизации на основе утверждений.

Наш веб-API был следующим:

protected void Application_Start()
{
        GlobalConfiguration.Configuration.MessageHandlers.Add(new AuthorizationHeaderHandler());

}

Тогда у нас будет AuthorizationHandler, который перезапишет Thread.CurrentPrincipal = Principal; и мы бы сделали.

В SignalR я попытался реализовать: 1. Отметить наш концентратор с помощью авторизации 2. Реализовать пользовательские атрибуты авторизации 3. Попробовать пользовательский модуль. Но помимо возврата true, если мы отправляем правильные заголовки, я все еще не получаю Context.User для изменения принципала, основанного на утверждениях, который мы генерируем.

Но мы никогда не сможем получить Context.User для отображения фактического пользователя, который используется для подключения к концентратору.

Любые предложения приветствуются.

Основная причина, по которой мы хотим добиться этого, заключается в том, что у нас есть несколько разных типов пользователей/машин, которые подключаются к нашей системе.

У кого какие предложения.


person CrazyBernie    schedule 14.03.2014    source источник


Ответы (1)


Наконец нашел решение.

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

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

Сначала создайте пользовательское ПО промежуточного слоя аутентификации:

public class AuthenticationMiddleware : OwinMiddleware
{
    public AuthenticationMiddleware(OwinMiddleware next) :
        base(next) { }


    public override async Task Invoke(IOwinContext context)
    {
        var request = context.Request;
        var value = request.Headers["Phocabby-MachineKey"];
        var username = value;
        var usernameClaim = new Claim(ClaimTypes.Name, username);
        var identity = new ClaimsIdentity(new[] { usernameClaim }, "ApiKey");
        var principal = new ClaimsPrincipal(identity);
        principal.Identities.First().AddClaim(new Claim("CanGetApiKey", "False"));
        principal.Identities.First().AddClaim(new Claim("Cabinet", "True"));
        request.User = principal;
        await Next.Invoke(context);
    }
}

Затем зарегистрируйте его в классе запуска

public void Configuration(IAppBuilder app)
{
    app.Use(typeof(AuthenticationMiddleware));
    app.MapSignalR();
}
person CrazyBernie    schedule 15.03.2014
comment
Потратив много часов на возню с пользовательским атрибутом авторизации SignalR и пытаясь каким-то образом получить мои утверждения о том, как мы аутентифицируемся, я могу подтвердить, что ваш ответ работает, и, по крайней мере, для меня он намного проще. Сейчас я просто украшаю свой хаб встроенным атрибутом [Авторизовать], и он просто работает. Я хотел сказать спасибо, но также сообщить другим об этой общей идее для меня, после изменения Invoke в соответствии с моими потребностями. - person Michael; 20.01.2015