2017-02-15 4 views
0

Azure Apps EasyAuth HTTPヘッダーをクレームに変換するためのASP .NETコアミドルウェアを作成したいと思います。Azure Apps EasyAuthが.NETコアで請求します

  1. EasyAuthがHTTPヘッダーで提供するトークンを解析します。これは、すべてのアイデンティティプロバイダのトークンを解析するコードを書く必要があるため、汎用ソリューションのようには見えません。

  2. /.auth/meに対してサーバー側の要求を行います。これは、私がクレームに変換したいJSONを返しますが、これを手動で行う必要があるかどうか、またはフレームワークのサポートがあるかどうかはわかりません。

#2は最良のアプローチであり、フレームワークのサポートはありますか?

答えて

3

あなたの説明によると、私は同様のissueを見つけました。私が知っているように、あなたが現在それを達成するためのフレームワークはありません。 Azure App Service EasyAuthを使用しているときにすべてのクレームを取得することを好む場合は、ビルド中のエンドポイント/.auth/meにサーバー側の要求を行い、以下のように要求を取得することをお勧めします。

Startup.cs>設定

app.Use(async (context, next) => 
{ 
    // Create a user on current thread from provided header 
    if (context.Request.Headers.ContainsKey("X-MS-CLIENT-PRINCIPAL-ID")) 
    { 
     // Read headers from Azure 
     var azureAppServicePrincipalIdHeader = context.Request.Headers["X-MS-CLIENT-PRINCIPAL-ID"][0]; 
     var azureAppServicePrincipalNameHeader = context.Request.Headers["X-MS-CLIENT-PRINCIPAL-NAME"][0]; 

     #region extract claims via call /.auth/me 
     //invoke /.auth/me 
     var cookieContainer = new CookieContainer(); 
     HttpClientHandler handler = new HttpClientHandler() 
     { 
      CookieContainer = cookieContainer 
     }; 
     string uriString = $"{context.Request.Scheme}://{context.Request.Host}"; 
     foreach (var c in context.Request.Cookies) 
     { 
      cookieContainer.Add(new Uri(uriString), new Cookie(c.Key, c.Value)); 
     } 
     string jsonResult = string.Empty; 
     using (HttpClient client = new HttpClient(handler)) 
     { 
      var res = await client.GetAsync($"{uriString}/.auth/me"); 
      jsonResult = await res.Content.ReadAsStringAsync(); 
     } 

     //parse json 
     var obj = JArray.Parse(jsonResult); 
     string user_id = obj[0]["user_id"].Value<string>(); //user_id 

     // Create claims id 
     List<Claim> claims = new List<Claim>(); 
     foreach (var claim in obj[0]["user_claims"]) 
     { 
      claims.Add(new Claim(claim["typ"].ToString(), claim["val"].ToString())); 
     } 

     // Set user in current context as claims principal 
     var identity = new GenericIdentity(azureAppServicePrincipalIdHeader); 
     identity.AddClaims(claims); 
     #endregion 

     // Set current thread user to identity 
     context.User = new GenericPrincipal(identity, null); 
    }; 

    await next.Invoke(); 
}); 
関連する問題