5

У меня есть веб-API с сервисом AUTH, для клиента WPF, настроить так:Как получить претензии, включенные в мой AuthTicket, в службе аутентификации веб-API?

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 
     ... 
    } 
} 

и

public partial class Startup 
{ 
    public void ConfigureAuth(IAppBuilder app) 
    { 
     ... 
     OAuthOptions = new OAuthAuthorizationServerOptions 
     { 
      TokenEndpointPath = new PathString("/Token"), 
      Provider = new ApplicationOAuthProvider(PublicClientId), 
      ApplicationCanDisplayErrors = true, 
      AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
      AllowInsecureHttp = true, // TODO Make false to deploy 
     }; 
     app.UseOAuthAuthorizationServer(OAuthOptions); 
    } 
} 

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

Как получить претензии пользователя (и, возможно, роли)? Есть ли что-то, что я могу сделать здесь, или я могу посидеть и запросить их через API, после авторизации и агрегировать их, а также в Auth Ticket в виде объекта Principal для клиента WPF?

Могу ли я включить некоторые компоненты Identity в приложение WPF, чтобы помочь с извлечением претензий из токена и любые предложения о том, как я должен это делать?

+0

Вся информация шифруется внутри самого маркера, так что добраться до него, вы должны расшифровать маркер. Конечно, у вас не может быть ключа дешифрования на клиенте - только на сервере. Итак, да, вы должны запросить их через API после авторизации (теоретически вы можете отправить их вместе с вашим ответом на авторизацию, но не уверены, что встроенная функция oauth имеет такую ​​возможность). – Evk

+0

Но мне не нужен поиск в БД, чтобы запросить их, просто расшифруйте токен аутентификации, который я должен отправить в любом случае, и отправьте назад претензии. Если хотите, любой намек на то, как расшифровать токен? Или это долгая история? – ProfK

+0

Вы хотите избежать разговора с вашим сервисом, чтобы получить претензии? Хотите собрать их вместе с самим токеном (так, от вызова до конечной точки/токена)? – Evk

ответ

2

Я думаю, что это очень опасно, чтобы позволить клиенту расшифровать токен. Если они могут это сделать, злоумышленник может изменить токен и претензии внутри. Если вы не проверяете действительность претензий (возможно, потому, что они предоставляются третьей стороной), это может привести к эскалации привилегий и компрометации вашего приложения.

Если клиентское приложение требует требований - возможно, для макета пользовательского интерфейса, то вы можете предоставить их отдельно к токену. Один из способов сделать это - через ActionFilterAttribute, чтобы написать претензии к пользовательскому HTTP-заголовку. Если претензии подделываются здесь, это влияет только на клиента, так как вы будете проверять защищенные претензии внутри токена перед обработкой любого запроса.

public AddClaimsAttribute : System.Web.Http.Filters.ActionFilterAttribute 
{ 
    var principal = actionExecutedContext.ActionContext.RequestContext.Principal as ClaimsPrincipal; 

    if (principal != null) 
    { 
     var claims = principal.Claims.Select(x => x.Type + ":" + x.Value).ToList(); 

     actionExecutedContext.Response.Content.Headers.Add("Claims", 
      String.Join(",", claims)); 
    } 

} 

Затем ваш клиент должен просто проверить этот заголовок и проанализировать его.

Это простой пример, вы можете отформатировать его как JSON или добавить ряд пользовательских заголовков «IsAdmin», «IsEditingUser» и т.д.

Потому что это фильтр, вы могли бы применить это глобально к каждому запросу , каждому действию на контроллере или конкретному действию по мере необходимости.

+0

Мне показалось, что я должен указать, что расшифровка претензий может быть легкой задачей, если токены подписаны (при этом поддельные жетоны не могут быть отправлены обратно, потому что они не могут быть подписаны). Например, JWT работает следующим образом. – Maverik

+0

@maverick Правда, но JWT не без него. Fltts.https: //auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/ –

+0

Это можно сказать, если что-то в мире программного обеспечения. Однако даже в вашей ссылке проблема связана с реализациями, а не с самим стандартом маркера, и библиотека реализации .NET не страдает от этого. Даже если бы это было сделано, исправление было бы опубликовано и его работа, чтобы идти в ногу с обновлениями – Maverik

2

Вы можете легко достичь этого, добавив роли пользователя в ответ на токен. Для этого вам необходимо обновить в классе ApplicationOAuthProvider.cs Метод CreateProperties

 public static AuthenticationProperties CreateProperties(User user) 
      { 
//get only roles ids 
//to do: retrieve user roles names 
       var roles = string.Join(",", user.Roles.Select(t => t.RoleId).ToArray()); 
//expose phone in response 
       var phone = user.PhoneNumber; 
       IDictionary<string, string> data = new Dictionary<string, string> 
       { 
        { "userName", user.UserName }, 
        { "userId", user.Id }, 
        { "roles", roles}, 
        { "phone", phone} 
       }; 
       return new AuthenticationProperties(data); 
      } 

Вы можете увидеть в почтальона ответ 3 новых свойств: USERID, роли и телефон. Будьте полезны для нулевых значений, когда вы добавите новые свойства.

enter image description here