- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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 的内容。
关于sql-server - 如何最好地结合 SQL Server 数据从 Active Directory 检索用户数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46674414/
我是一名优秀的程序员,十分优秀!