1

我有一個Web應用程序,它將數據存儲在Azure SQL數據庫中以及有關Azure Active Directory B2C中經過身份驗證的用戶的數據。 SQL數據庫中的數據通過其「oid」(GUID)與AD用戶相關聯。這意味着獲取數據庫不允許任何人識別特定的用戶。但是,當我查詢SQL數據爲訪問者創建表或圖表時,我顯然希望顯示與擁有數據的用戶相關的數據(即顯示用戶的全名,而不是他們的oid!) 。如何以最佳方式從Active Directory中檢索用戶數據以及SQL Server數據

我知道在網頁上呈現SQL查詢結果時,我可以使用Azure Graph API來獲取用戶數據,但這似乎是一種非常低效的方法。添加到其中,我不知道如何通過一批oid來獲取所有用戶對象,而無需使用可觀的長查詢字符串過濾器!

我可以創建一種查詢整個AD的同步過程) 並更新定時過程(可能是Azure功能)上的SQL表,但這似乎也是非常低效的?

我看了一下Microsoft Graph API webhooks,但目前似乎沒有任何訂閱可以與用戶對象更改掛鉤,他們不建議使用B2C的Graph。

另一種選擇,我想將有一個緩存某處存儲的數據更快的查找,但這將不得不更新到。

任何建議感激地讚賞。

回答

1

實際上它非常簡單(假設您已經過身份驗證)。以此爲模板的GET請求:

{baseUrl}/{tenantId}/users/{oid}?api-version={api-version} 

不要忘了你的承載令牌添加到Authorization頭:

Authorization: Bearer {accessToken} 

而且,這裏是一個對象,你可以使用的一個例子爲響應(在Java中),與檢索註冊電子郵件一些有用的方法(假設你使用內置的B2C用戶,而不是第三方,如谷歌):

import com.fasterxml.jackson.annotation.JsonIgnore; 
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 
import com.fasterxml.jackson.annotation.JsonProperty; 

import java.util.ArrayList; 
import java.util.List; 

@JsonIgnoreProperties(ignoreUnknown = true) 
public class GraphApiUserExample{ 

    @JsonProperty("objectId") 
    private String id; 

    private Boolean accountEnabled; 

    private com.brmic.azure.graph.api.client.model.PasswordProfile PasswordProfile; 

    private List<SignInName> signInNames; 

    private String surname; 

    private String displayName; 

    private String givenName; 

    @JsonProperty("userPrincipalName") 
    private String userPrincipalName; 

    public String getId(){ 

     return id; 
    } 

    public void setId(final String id){ 

     this.id = id; 
    } 

    public Boolean getAccountEnabled(){ 

     return accountEnabled; 
    } 

    public void setAccountEnabled(final Boolean accountEnabled){ 

     this.accountEnabled = accountEnabled; 
    } 

    public com.brmic.azure.graph.api.client.model.PasswordProfile getPasswordProfile(){ 

     return PasswordProfile; 
    } 

    public void setPasswordProfile(final com.brmic.azure.graph.api.client.model.PasswordProfile passwordProfile){ 

     PasswordProfile = passwordProfile; 
    } 

    public List<SignInName> getSignInNames(){ 

     return signInNames; 
    } 

    public void setSignInNames(final List<SignInName> signInNames){ 

     this.signInNames = signInNames; 
    } 

    public String getSurname(){ 

     return surname; 
    } 

    public void setSurname(final String surname){ 

     this.surname = surname; 
    } 

    public String getDisplayName(){ 

     return displayName; 
    } 

    public void setDisplayName(final String displayName){ 

     this.displayName = displayName; 
    } 

    public String getGivenName(){ 

     return givenName; 
    } 

    public void setGivenName(final String givenName){ 

     this.givenName = givenName; 
    } 

    public String getUserPrincipalName(){ 

     return userPrincipalName; 
    } 

    public void setUserPrincipalName(final String userPrincipalName){ 

     this.userPrincipalName = userPrincipalName; 
    } 

    @JsonIgnore 
    public String getSignInEmail(){ 

     String email = ""; 
     if(signInNames != null){ 
      for(SignInName signInName : signInNames){ 
       if(signInName.getType().equals("emailAddress")){ 
        email = signInName.getValue(); 
        break; 
       } 
      } 
     } 
     return email; 
    } 

    @JsonIgnore 
    public void setSignInEmail(String signInEmail){ 

     if(signInNames == null){ 
      signInNames = new ArrayList<>(); 
      signInNames.add(new SignInName("emailAddress", signInEmail)); 
      return; 
     } 

     for(SignInName signInName : signInNames){ 
      if(signInName.getType().equals("emailAddress")){ 
       signInName.setValue(signInEmail); 
       break; 
      } 
     } 
    } 
} 

如果你想PU如果有多個用戶,您可以添加一個查詢,而不是「oid」來過濾並遍歷結果。

{baseUrl}/{tenantId}/users?api-version={api-version}&$skiptoken={skiptoken}&$top={top}&$filter={attributeOne} eq '{valueOne}' 
{baseUrl}/{tenantId}/users?api-version={api-version}&$skiptoken={skiptoken}&$top={top}$filter=signInNames/any(x:x/value eq '{email}') 

它返回一個JSON對象是這樣的:

{ 
    "users":[...], 
    "odata":{ 
     "nextLink": "{baseUrl}/{tenantId}/users?api-version={api-version}&$skiptoken={skiptoken}&$top={top}&$filter={attributeOne} eq '{valueOne}'" 
     "metadata": "I forget if this is just a string or a parsable JSON object." 
    } 

} 

您仍然有查詢的結果匹配您的數據庫結果,這將是一項繁重的操作的問題。 如果你需要運行更快的操作,我建議你使用緩存結果在表中進行連接。 它確實感到kludgey,但只是因爲它。

還有一些可以使用的B2C azure powershell模塊的powershell命令,您可以使用ADAL在SQL Server中創建一個用於更新表或視圖內容的作業。

文檔是在這裏:https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet

+0

謝謝您的建議Pytry - 我已經有代碼,可以調用使用GET認證與每個OID要求每行的API。我的觀點是,我需要在網頁的輸出結果中每行執行一次。這感覺非常低效,所以我一直在尋找緩解這種方式的方法 - 一次性傳遞一堆oid的方式? – RNDThoughts

+0

這最終成爲我與之一起的方式,但感覺不太正確。 – RNDThoughts

+0

很抱歉沒有及時回覆(忙)。您還可以添加一個查詢以同時獲取多個用戶,然後運行其他篩選器/驗證以使其與來自SQL Server的數據相匹配。沒有人知道這種操作的沉重感。如果你需要快速訪問結果,然後開始尋找緩存。給我一點(希望今天)更新我的答案,包括多個結果查詢。 – Pytry

相關問題