1

私はAzure Active Directory B2CのAzure SQLデータベースと認証されたユーザーに関するデータを格納するWebアプリケーションを持っています。 SQLデータベース内のデータは、ADユーザーと、その "oid"(GUID)によって関連付けられます。つまり、データベースを取得しても、特定のユーザーを特定することはできません。Active DirectoryからユーザーデータをSQL Serverデータと共に取得するにはどうすればいいですか

しかし、訪問者にテーブルやチャートを作成するためにSQLデータを照会すると、データを所有しているユーザーとの関係でデータを表示したいとします(つまり、そのoidではなくユーザーのフルネームを表示します)。 。

ウェブページでSQLクエリの結果をレンダリングするときにユーザーデータを取得するのに、Azure Graph APIを使用できますが、これは非常に非効率的な方法です。どのくらいの、私はどのくらい私はバカの中のすべてのユーザーのオブジェクトを取得するには、バストの中で渡すだろうか分からない長いクエリ文字列フィルタを使用していない!

私は と時間を計られたプロセス(多分Azure関数)でSQLテーブルを更新するいくつかの並べ替えプロセスを作成することができますが、それはひどく非効率的ですね?

私はMicrosoft Graph APIウェブフックを見ていましたが、現時点では、ユーザーオブジェクトの変更に関して私が取り組むことができるサブスクリプションがないようで、B2Cでグラフを推奨しません。

私が推測する他のオプションは、より高速な検索のためにデータを保存するキャッシュをどこかに持つことですが、これは更新する必要があります。

感謝の意を表します。

答えて

1

これはかなり簡単です(すでに認証されていると仮定します)。 GETリクエストのためのテンプレートとしてこれを使用します。

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

は、Authorizationヘッダーにごベアラトークンを追加することを忘れないでください:

Authorization: Bearer {accessToken} 

はまた、ここにあなたが使用する可能性のあるオブジェクトの例です。 (Javaで)応答のために、(あなたがGoogleのような代わりに、サードパーティの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'の代わりにクエリを追加して、フィルタリングして結果をページできます。このようなJSONオブジェクトを返します

{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}') 

{ 
    "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." 
    } 

} 

あなたはまだ重い操作になるだろう、あなたのDBの結果にクエリの結果を一致させる問題があります。 より高速な操作を実行する必要がある場合は、結合の結果をテーブルにキャッシュすることをお勧めします。 kludgeyを感じますが、それだけであるからです。

使用できるB2C Azure PowerShellモジュールのpowershellコマンドもあります.ADALを使用して、SQL Serverでジョブを作成してテーブルやビューの内容を更新することもできます。

ドキュメントはここにある:あなたの提案Pytryためhttps://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet

+0

おかげで - 私は既に認証が各OIDにGET要求を使用して、行ごとにAPIを呼び出すことができ、コードを持っています。私の主張は、Webページの出力結果で行ごとに1回これを行う必要があるということです。これはひどく非効率的だと感じましたので、私はこれを緩和する方法を探していました - 多分一度に大量のoidを渡すのですか? – RNDThoughts

+0

これは私がそれに行った方法であったが、かなり正しいとは思わない。 – RNDThoughts

+0

すぐにあなたに戻ってこない(申し訳ありません)申し訳ありません。一度に複数のユーザーを取得するクエリを追加し、追加のフィルタ/検証を実行してSQL Serverのデータと照合することもできます。このような操作の重いことを回避することはできません。結果にすばやくアクセスする必要がある場合は、キャッシュの調査を開始します。私の答えを更新して複数の結果クエリを含めるには、ちょっと(うまくいけば今日)。 – Pytry

関連する問題