gpt4 book ai didi

sql-server - 如何最好地结合 SQL Server 数据从 Active Directory 检索用户数据

转载 作者:行者123 更新时间:2023-12-03 03:03:37 24 4
gpt4 key购买 nike

我有一个 Web 应用程序,它将其数据存储在 Azure SQL 数据库中,并将有关经过身份验证的用户的数据存储在 Azure Active Directory B2C 中。 SQL 数据库中的数据通过“oid”(GUID) 与 AD 用户相关。这意味着获取数据库不允许任何人识别特定用户。

但是,当我查询 SQL 数据以向访问者创建表或图表时,我显然希望显示与拥有该数据的用户相关的数据(即显示用户的全名,而不是他们的 oid!)。

我知道我可以使用 Azure Graph API在网页上呈现 SQL 查询结果时获取用户数据,但这似乎是一种非常低效的方法。除此之外,我不确定如何传递一批 oid 来获取所有用户对象,而不使用长得可笑的查询字符串过滤器!

我可以创建某种同步过程来查询整个 AD)并在定时进程(可能是 Azure 函数)上更新 SQL 表,但这似乎也非常低效?

我查看了 Microsoft Graph API Webhook,但目前似乎没有任何可以与用户对象更改相关的订阅,而且他们不推荐使用 Graph with B2C。

我猜想的另一个选择是在某个地方有一个缓存,用于存储数据以便更快地查找,但这必须更新。

如有任何建议,我们将不胜感激。

最佳答案

实际上非常简单(假设您已经通过身份验证)。使用此作为 GET 请求的模板:

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

不要忘记将您的不记名 token 添加到授权 header 中:

Authorization: Bearer {accessToken}

此外,这里是一个您可以用于响应的对象示例(在 Java 中),其中包含一些用于检索注册电子邮件的有用方法(假设您使用的是内置 B2C 用户而不是第三方,例如 google):

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

如果您想拉取多个用户,您可以添加查询而不是“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."
}

}

您仍然会遇到将查询结果与数据库结果相匹配的问题,这将是一项繁重的操作。如果您需要运行更快的操作,我建议您将结果缓存在表中以进行连接。它确实让人感觉很困惑,但只是因为它确实如此。

您还可以使用 B2C azure powershell 模块中的一些 powershell 命令,并且您可以使用 ADAL 在 SQL Server 中创建作业来更新表或 View 的内容。

文档位于:https://learn.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet

关于sql-server - 如何最好地结合 SQL Server 数据从 Active Directory 检索用户数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46674414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com