5

mam API Web z usługą auth, dla klienta WPF skonfigurować tak:Jak mogę uzyskać roszczenia zawarte w moim AuthTicket w usłudze uwierzytelniania Web API?

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

i

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); 
    } 
} 

ja tylko kiedykolwiek użyć końcowego /Token tak daleko, bo w najmniej daje mi token na okaziciela. Bilet otrzymany po udanym uwierzytelnieniu ma daty wydania i wygaśnięcia, token na okaziciela i moją nazwę użytkownika.

Jak uzyskać roszczenia użytkownika (a może role)? Czy jest coś, co mogę tutaj zrobić, czy też robię to w ukryciu i żądam ich za pośrednictwem interfejsu API, po uwierzytelnieniu, i agreguję je i Auth Ticket w coś w rodzaju obiektu Principal dla klienta WPF?

Czy mógłbym dołączyć niektóre elementy tożsamości w aplikacji WPF, aby pomóc w wyodrębnieniu roszczeń z tokena i sugestii, w jaki sposób powinienem to zrobić?

+0

Wszystkie informacje są szyfrowane wewnątrz samego powodu, tak aby się do niego dostać trzeba odszyfrować token. Oczywiście nie można mieć klucza deszyfrującego na kliencie - tylko na serwerze. Tak więc - musisz poprosić ich przez API po auth (teoretycznie możesz wysłać je razem z odpowiedzią auth, ale nie jesteś pewien, czy wbudowane oauth ma taką możliwość). – Evk

+0

Ale nie potrzebuję wyszukiwania DB, aby o nie poprosić, wystarczy odkodować token uwierzytelniający, który i tak muszę wysłać, i odesłać roszczenia. Jeśli tak, jakaś wskazówka, jak odszyfrować token? A może to długa historia? – ProfK

+0

Chcesz uniknąć oddzielnego połączenia z usługą, aby uzyskać roszczenia? Chcesz je połączyć z samym tokenem (czyli od wywołania do punktu końcowego tokenu)? – Evk

Odpowiedz

2

Myślę, że to dość niebezpieczne, aby umożliwić klientowi odszyfrowanie tokena. Jeśli mogą to zrobić, złośliwy aktor może zmodyfikować token i roszczenia wewnątrz. Jeśli nie sprawdzasz ważności roszczeń (być może dlatego, że są one dostarczane przez stronę trzecią), może to prowadzić do eskalacji uprawnień i złamania zabezpieczeń Twojej aplikacji.

Jeśli aplikacja kliencka wymaga roszczeń - być może w przypadku układu interfejsu użytkownika, możesz podać je osobno tokenowi. Jednym ze sposobów, aby to zrobić, to poprzez ActionFilterAttribute napisać roszczenia do niestandardowego nagłówka http. Jeśli w tym miejscu zostaną naruszone roszczenia, dotyczy to tylko klienta, ponieważ sprawdzisz bezpieczne roszczenia wewnątrz tokena przed przetworzeniem żądania.

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)); 
    } 

} 

Twój klient musi tylko sprawdzić ten nagłówek i przeanalizować go.

Jest to prosty przykład, można sformatować go jako JSON lub dodać szereg niestandardowych nagłówków „IsAdmin”, „IsEditingUser” itd

Ponieważ jest filtrem, można zastosować ten globalnie do każdego wniosku , do każdego działania na kontrolerze lub do określonej akcji, gdy jej potrzebujesz.

+0

Czułam, że powinienem zaznaczyć, że odszyfrowywanie roszczeń może być łatwym zadaniem, jeśli tokeny są podpisane (dlatego nie można odesłać podrobionych tokenów, ponieważ nie można ich odzyskać). JWT na przykład działa w ten sposób. – Maverik

+0

@maverick Prawda, ale JWT nie jest bez jego wad .https: //auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/ –

+0

Można to powiedzieć, jeśli prawie wszystko w świecie oprogramowania. Jednak nawet w twoim łączu problem dotyczy implementacji, a nie samego standardu tokena, a biblioteka implementacji .net nie cierpi z tego powodu. Nawet gdyby tak się stało, poprawka zostanie opublikowana, a naszym zadaniem będzie nadążanie za aktualizacjami – Maverik

2

Możesz to łatwo osiągnąć, dodając role użytkownika do odpowiedzi na tokena. W tym celu trzeba aktualizować w klasie ApplicationOAuthProvider.cs się CreateProperties metoda

 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); 
      } 

można zobaczyć w listonosz odpowiedź 3 nowe właściwości: userid, ról i telefon. Aby dodawać nowe właściwości, należy używać wartości pustych.

enter image description here