c# - 使用 Azure AD Graph 客户端 API 更改用户密码的权限问题

标签 c# azure permissions azure-active-directory

我正在尝试在 ASP.Net MVC 中创建一个页面来重置当前用户的密码。我正在使用 Azure Active Directory 进行用户身份验证。为了访问用户的 AD 信息,我使用 C# Graph API 客户端。我的代码基于 GitHub 上找到的示例

我能够更改用户的信息(例如城市、州、电子邮件)。但是,当我尝试使用用户对象上的 PasswordProfile 属性更改密码时,收到一条错误消息,指出我没有足够的权限。我正在尝试更改应用程序的密码,并且我相信权限问题的根源在于应用程序。

我发现以下 PowerShell 脚本应该将公司管理员角色添加到应用程序。但是,对 Get-MsolServicePrincipal 的调用不会返回任何内容。查看命令的输出,我没有看到任何与我的应用程序名称相似的条目。

#-----------------------------------------------------------
# This will prompt you for your tenant's credential
# You should be able to use your your Azure AD administrative user name
# (in the <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="751411181c1b3501101b141b015b1a1b181c16071a061a13015b161a18" rel="noreferrer noopener nofollow">[email protected]</a> format)
#-----------------------------------------------------------
import-module MSOnline
Connect-MsolService

#-----------------------------------------------------------
# Replace the Application Name with the name of your 
# Application Service Principal
#-----------------------------------------------------------
$displayName = "My Azure AD Application"
$objectId = (Get-MsolServicePrincipal -SearchString $displayName).ObjectId

#-----------------------------------------------------------
# This will add your Application Service Prinicpal to 
# the Company Administrator role
#-----------------------------------------------------------
$roleName = "Company Administrator"              
Add-MsolRoleMember -RoleName $roleName -RoleMemberType ServicePrincipal -RoleMemberObjectId $objectId

我想我的第一个问题是我是否正确地认为权限问题与应用程序有关?

第二,我应该将 $displayName 变量设置为什么值?

最佳答案

您需要确保 Azure Active Directory 中的应用程序配置具有适当的权限设置。使用上面的内容添加权限是多余的。您应该只向目录中的应用程序添加所需的权限。

作为起点,我建议您查看 Graph API Consent Permission博客文章在这里。您只能使用传统权限以帐户或全局管理员身份重置密码,但您应该分配应用程序权限。

“读取和写入目录数据”曾经提供此权限,但我相信它已被删除。现在我相信用户必须同意使用 OAuth 身份验证流程才能重置密码。

请参阅changePassword方法了解当前登录用户的更多信息。我有一个自定义桌面应用程序供用户重置自己的密码。

在我的应用程序中,我让用户使用其现有密码进行身份验证以获取访问 token (这也有助于我在更改密码之前验证他们当前的凭据)。

var authority = string.Format(CultureInfo.InvariantCulture, "https://login.microsoftonline.com/" + Domain);
var ctx = new AuthenticationContext(authority, false);
var result = ctx.AcquireToken("https://graph.windows.net", "ClientID", credential);
return result.AccessToken;

凭据属性是使用用户 UPN 和密码的 UserCredential 类型。然后我传递一个网络请求来更改密码。

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", UserAccessToken);
var requestUri = $"https://graph.windows.net/me/changePassword?api-version={Constants.ApiVersion}";
var pwdObject = new { currentPassword = curPassword, newPassword = newPass };
var body = new JavaScriptSerializer().Serialize(pwdObject);
var response = client.PostAsync(new Uri(requestUri), new StringContent(body, Encoding.UTF8, "application/json")).Result;

如果请求成功,这将返回 HTTP 204,在获取用户 token 时我还会捕获 AADSTS50126 异常,因为这表明获取 token 时凭据无效。

关于c# - 使用 Azure AD Graph 客户端 API 更改用户密码的权限问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37283219/

相关文章:

c# - 使用 C# "dynamic"关键字实例化

c# - 通过另一个类更新标签

javascript - JavaScript 客户端应用程序中的权限/ACL

c# - 在 Windows 7 下为非管理员用户提供目录的完全控制

c# - 在实体接口(interface) (EF Core) 中声明要忽略的属性

c# - 在静态类中有状态是不好的做法吗?

c# - 无法追加到 Azure 中的追加 Blob

web-services - 使用 CRM SDK 和 Web 服务将与 MS CRM 动态集成的自定义应用程序在线托管到 Windows Azure 上

azure - 如何创建允许注册应用程序和服务主体的 Azure 自定义角色

hadoop - 使用配置单元初始化数据库时出现 java.sql.SQLException : Failed to start database 'metastore_db' ERROR,