Получите IPrincipal от токена носителя OAuth в OWIN

Я успешно добавил OAuth в мой проект WebAPI 2, используя OWIN. Я получаю токены и могу использовать их в заголовке HTTP для доступа к ресурсам.

Теперь я хочу использовать эти токены также на других каналах для аутентификации, которые не являются стандартными HTTP-запросами, для которых создан шаблон OWIN. Например, я использую WebSockets, где клиент должен отправить токен-маркер OAuth для аутентификации.

На стороне сервера я получаю токен через WebSocket. Но как я могу теперь поместить этот токен в конвейер OWIN, чтобы извлечь из него IPrincipal и ClientIdentifier? В шаблоне WebApi 2 все это абстрагируется для меня, поэтому мне нечего делать, чтобы он работал.

Итак, в основном, у меня есть токен в виде строки и вы хотите использовать OWIN для доступа к информации пользователя, закодированной в этом токене.

Заранее спасибо за помощь.

Я нашел часть решения в этом блоге: http://leastprivilege.com/2013/10/31/retrieving-bearer-tokens-from-alternative-locations-in-katanaowin/

Поэтому я создал свой собственный провайдер следующим образом:

public class QueryStringOAuthBearerProvider : OAuthBearerAuthenticationProvider { public override Task RequestToken(OAuthRequestTokenContext context) { var value = context.Request.Query.Get("access_token"); if (!string.IsNullOrEmpty(value)) { context.Token = value; } return Task.FromResult(null); } } 

Затем мне нужно было добавить его в свое приложение в Startup.Auth.cs, как это:

 OAuthBearerOptions = new OAuthBearerAuthenticationOptions() { Provider = new QueryStringOAuthBearerProvider(), AccessTokenProvider = new AuthenticationTokenProvider() { OnCreate = create, OnReceive = receive }, }; app.UseOAuthBearerAuthentication(OAuthBearerOptions); 

С помощью настраиваемого AuthenticationTokenProvider я могу извлечь все остальные значения из токена в начале конвейера:

 public static Action create = new Action(c => { c.SetToken(c.SerializeTicket()); }); public static Action receive = new Action(c => { c.DeserializeTicket(c.Token); c.OwinContext.Environment["Properties"] = c.Ticket.Properties; }); 

И теперь, например, в моем WebSocket Hander, я могу получить ClientId и другие, как это:

 IOwinContext owinContext = context.GetOwinContext(); if (owinContext.Environment.ContainsKey("Properties")) { AuthenticationProperties properties = owinContext.Environment["Properties"] as AuthenticationProperties; string clientId = properties.Dictionary["clientId"]; ... } 

По умолчанию OWIN использует защиту данных машинного ключа ASP.NET для защиты токена доступа OAuth при размещении в IIS. Вы можете использовать class MachineKey в System.Web.dll для снятия защиты с токенов.

 public class MachineKeyProtector : IDataProtector { private readonly string[] _purpose = { typeof(OAuthAuthorizationServerMiddleware).Namespace, "Access_Token", "v1" }; public byte[] Protect(byte[] userData) { throw new NotImplementedException(); } public byte[] Unprotect(byte[] protectedData) { return System.Web.Security.MachineKey.Unprotect(protectedData, _purpose); } } 

Затем создайте TicketDataFormat, чтобы получить объект AuthenticationTicket, где вы можете получить свойство ClaimsIdentity и AuthenticationProperties.

 var access_token="your token here"; var secureDataFormat = new TicketDataFormat(new MachineKeyProtector()); AuthenticationTicket ticket = secureDataFormat.Unprotect(access_token); 

Чтобы снять защиту с других токенов OAuth, вам просто нужно изменить содержимое _purpose. Подробную информацию см. В разделе Класс OAuthAuthorizationServerMiddleware: http://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.Security.OAuth/OAuthAuthorizationServerMiddleware.cs

 if (Options.AuthorizationCodeFormat == null) { IDataProtector dataProtecter = app.CreateDataProtector( typeof(OAuthAuthorizationServerMiddleware).FullName, "Authentication_Code", "v1"); Options.AuthorizationCodeFormat = new TicketDataFormat(dataProtecter); } if (Options.AccessTokenFormat == null) { IDataProtector dataProtecter = app.CreateDataProtector( typeof(OAuthAuthorizationServerMiddleware).Namespace, "Access_Token", "v1"); Options.AccessTokenFormat = new TicketDataFormat(dataProtecter); } if (Options.RefreshTokenFormat == null) { IDataProtector dataProtecter = app.CreateDataProtector( typeof(OAuthAuthorizationServerMiddleware).Namespace, "Refresh_Token", "v1"); Options.RefreshTokenFormat = new TicketDataFormat(dataProtecter); } 

в дополнение к johnny-qian ответ, используя этот метод, лучше создать DataProtector. Ответ johnny-qian , зависит от IIS и не выполняется при самообслуживании.

 using Microsoft.Owin.Security.DataProtection; var dataProtector = app.CreateDataProtector(new string[] { typeof(OAuthAuthorizationServerMiddleware).Namespace, "Access_Token", "v1" }); 

Каков ваш токен, например, это строка шифрования или форматированная строка, какой формат?

Я мой код:

 public static Action receive = new Action(c => { if (!string.IsNullOrEmpty(c.Token)) { c.DeserializeTicket(c.Token); //c.OwinContext.Environment["Properties"] = c.Ticket.Properties; } }); 

Значение c.Ticket всегда равно нулю.

  • Как вы входите в систему / аутентифицируете пользователя с битами Asp.Net MVC5 RTM с использованием AspNet.Identity?
  • Как получить доступ к личной информации Facebook, используя идентификатор ASP.NET (OWIN)?
  • Самостоятельный хостинг OWIN и urlacl
  • Недопустимый class запуска OWIN
  • Получить дополнительные данные из структуры MVC5. Поставщик идентификации OAuth / OWin с внешним поставщиком авторизации
  • Добавление аутентификации идентификатора ASP.NET MVC5 в существующий проект
  • Interesting Posts

    Android: добавление статического заголовка в начало ListActivity

    Что такое простой, маленький, но хороший наблюдатель RSI для Windows?

    ListView с OnItemClickListener android

    Как использовать одно подключение к Интернету для VPN, а другое – для доступа к другим сайтам?

    Как я могу запустить (16-разрядный) .COM исполняемый файл, который был переименован в .COS?

    Невозможно прочитать защищенные DVD-диски в оболочковой / безголовой системе

    Программное обеспечение для маркировки музыки более последовательное, чем Tag & Rename?

    Как я могу сериализовать внутренние classы с помощью XmlSerializer?

    Программно создавая расширяющийся интерфейс UItableViewCell

    Почему обратный вызов setInterval выполняется только один раз?

    Entity Framework – Почему явным образом задал состояние объекта для изменения?

    Что такое «$$», используемое в PL / pgSQL

    Проверьте, существует ли сеанс JSF

    Могут ли жесткие диски читать и записывать одновременно на разных дорожках? Как?

    Весенний фильтр социальной аутентификации для безстоящих конечных точек REST, использующих токен Facebook для аутентификации

    Давайте будем гением компьютера.