5

Tôi có một API Web với một dịch vụ auth, cho một khách hàng WPF, thiết lập như thế này:Làm cách nào để nhận được các khiếu nại được bao gồm trong AuthTicket của tôi trong Dịch vụ xác thực API Web?

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

tôi chỉ bao giờ sử dụng /Token endpoint cho đến nay, vì nó ở ít nhất là cấp cho tôi mã thông báo mang. Vé tôi nhận được trên xác thực thành công có vấn đề và ngày hết hạn, mã thông báo mang và tên người dùng của tôi.

Làm cách nào để nhận được xác nhận quyền sở hữu của người dùng (và có thể là vai trò)? Có cái gì tôi có thể làm ở đây, hoặc tôi làm theo tôi và yêu cầu họ thông qua API, sau khi auth, và tổng hợp chúng và vé Auth trong một cái gì đó giống như một đối tượng Principal cho khách hàng WPF?

Tôi có thể bao gồm một số thành phần Identity trong ứng dụng WPF để giúp trích xuất các xác nhận quyền sở hữu từ mã thông báo và mọi đề xuất về cách tôi nên làm điều này không?

+0

Tất cả thông tin được mã hóa bên trong mã thông báo, do đó bạn có thể giải mã mã thông báo. Tất nhiên bạn không thể có khóa giải mã trên máy khách - chỉ trên máy chủ. Vì vậy, có - bạn phải yêu cầu họ thông qua API sau khi auth (theo lý thuyết bạn có thể gửi chúng cùng với phản hồi auth của bạn, nhưng không chắc chắn nếu oauth tích hợp có khả năng như vậy). – Evk

+0

Nhưng tôi không cần một tra cứu DB để yêu cầu họ, chỉ cần giải mã mã thông báo auth tôi phải gửi anyway, và gửi lại các yêu cầu bồi thường. Nếu bạn vui lòng, bất kỳ gợi ý về cách giải mã mã thông báo? Hay đó là một câu chuyện dài? – ProfK

+0

Bạn muốn tránh cuộc gọi riêng đến dịch vụ của bạn để nhận được khiếu nại? Bạn muốn nhận chúng cùng với mã thông báo (vì vậy, từ cuộc gọi đến điểm cuối/token)? – Evk

Trả lời

2

Tôi nghĩ khá nguy hiểm khi cho phép khách hàng giải mã mã thông báo. Nếu họ có thể làm điều đó, một diễn viên độc hại có thể sửa đổi mã thông báo và các xác nhận quyền sở hữu bên trong. Nếu bạn không kiểm tra tính hợp lệ của các xác nhận quyền sở hữu (có thể do chúng được cung cấp bởi bên thứ ba) thì điều đó có thể dẫn đến việc leo thang và thỏa hiệp đặc quyền của ứng dụng của bạn.

Nếu ứng dụng khách yêu cầu xác nhận quyền sở hữu - có lẽ cho bố cục giao diện người dùng, khi đó bạn có thể cung cấp riêng cho mã thông báo đó. Một cách để thực hiện việc này là thông qua một số ActionFilterAttribute để viết xác nhận quyền sở hữu cho tiêu đề http tùy chỉnh. Nếu các xác nhận quyền sở hữu bị giả mạo ở đây, nó chỉ ảnh hưởng đến khách hàng, vì bạn sẽ kiểm tra các yêu cầu bảo mật bên trong mã thông báo trước khi xử lý bất kỳ yêu cầu nào.

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

} 

Khách hàng của bạn chỉ cần kiểm tra tiêu đề này và phân tích cú pháp tiêu đề này.

Đây là một ví dụ cơ bản, bạn có thể định dạng nó như JSON hoặc thêm một loạt các tiêu đề tùy chỉnh "IsAdmin", "IsEditingUser" vv

Bởi vì nó là một bộ lọc, bạn có thể áp dụng điều này trên toàn cầu để mọi yêu cầu , cho mọi hành động trên bộ điều khiển hoặc một hành động cụ thể khi bạn cần.

+0

Tôi cảm thấy như tôi nên chỉ ra rằng giải mã các tuyên bố có thể là một nhiệm vụ dễ dàng nếu các mã thông báo được ký (do đó không thể gửi lại mã thông báo giả mạo vì chúng không thể được ký lại). JWT, ví dụ, chạy như thế này. – Maverik

+0

@maverick Đúng, nhưng JWT không phải là không có nó flaws.https: //auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/ –

+0

Điều đó có thể nói nếu có nhiều thứ trong thế giới phần mềm. Tuy nhiên, ngay cả trong liên kết của bạn, vấn đề là với việc triển khai và không phải là tiêu chuẩn mã thông báo, và thư viện thực hiện .net dường như không bị ảnh hưởng bởi điều đó. Ngay cả khi nó đã làm, sửa chữa sẽ được đăng và công việc của chúng tôi để theo kịp với bản cập nhật – Maverik

2

Bạn có thể dễ dàng đạt được điều này bằng cách thêm vai trò người dùng trong phản hồi mã thông báo. Để làm được điều này, bạn phải cập nhật trong lớp ApplicationOAuthProvider.cs phương pháp 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); 
      } 

Bạn có thể thấy trong người đưa thư trả lời 3 thuộc tính mới: userId, vai trò và điện thoại. Được carrefull cho giá trị null khi bạn sẽ thêm các thuộc tính mới.

enter image description here

Các vấn đề liên quan