5

我有一個身份驗證服務的Web API,對於一個WPF客戶端,設置是這樣的:因爲它在如何在Web API Auth服務中獲得AuthTicket中包含的聲明?

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之後,將它們和驗證票集合起來,像WPF客戶端的Principal對象?

我是否可以在WPF應用程序中包含一些標識組件以幫助從標記中提取聲明,以及有關如何執行此操作的任何建議?

+0

所有信息令牌本身內部加密的,所以要得到它,你必須對令牌進行解密。當然,你不能在客戶端上有解密密鑰 - 只能在服務器上使用。所以是的 - 你必須在auth後通過API請求它們(理論上你可以將它們與auth響應一起發送,但不確定內置oauth是否有這種可能性)。 – Evk

+0

但我不需要數據庫查詢來請求它們,只需解碼我必須發送的身份驗證令牌,然後發回聲明。如果您願意,請提供關於如何解密令牌的提示?或者這是一個很長的故事? – ProfK

+0

您想避免單獨致電您的服務以獲取理賠嗎?想要將它們與令牌本身結合在一起(因此,從調用到/ token端點)? – Evk

回答

2

我認爲允許客戶端解密令牌是相當危險的。如果他們可以這樣做,惡意行爲者可以修改令牌和內部的索賠。如果您沒有檢查索賠的有效性(可能是因爲它們是由第三方提供的),那麼這可能會導致您的應用程序的權限升級和妥協。

如果客戶端應用程序需要聲明 - 可能是用於UI佈局,那麼您可以將它們單獨提供給令牌。一種方法是通過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

我覺得我應該指出,解密索賠可以如果令牌被簽名,這是一件容易的事情(因爲僞造的令牌不能被回發,所以僞造的令牌不能被回發)。例如,智威湯遜就是這樣運作的。 – Maverik

+0

@maverick誠然,但智威湯遜並非沒有缺點.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個新特性,請查閱:用戶id,角色和電話。當您將添加新屬性時,請爲carrefull爲null值。

enter image description here

相關問題