使用Azure AD Graph客户端API更改用户密码的权限问题
我正尝试在ASP.Net MVC中创建一个页面来重置当前用户的密码。我正在使用Azure活动目录进行用户验证。要访问用户的AD信息,我正在使用C#Graph API客户端。我的代码基于在GitHub使用Azure AD Graph客户端API更改用户密码的权限问题
上找到的样本。我可以对用户的信息(如城市,州,邮件)进行更改。但是,当我尝试使用用户对象上的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 [email protected] 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方法。我有一个自定义桌面应用程序供用户重置自己的密码。
在我的应用程序中,我让用户使用其现有密码进行身份验证以获取访问令牌(这也有助于在更改密码之前验证其当前凭据)。
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
类型。然后我传递一个Web请求来更改密码。
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,如果请求是成功的,我也陷阱获得用户令牌,因为这当AADSTS50126异常指示获取令牌当凭证无效。
您可以扩展如何创建UserCredential?我所看到的唯一属性和构造函数是用户名。桌面应用程序和Web应用程序库有区别吗? –
我不认为存在差异否,下面是使用'UserCredential'的一些信息... http://www.cloudidentity.com/blog/2014/07/08/using-adal-net-to-authenticate -users-via-usernamepassword /基本用法虽然是...'var credential = new UserCredential(“username”,“password”);' –
由于某种原因,UserCredential对我来说没有两个构造函数,但UserPasswordCredential可以做到这一点。在调整我的常量和权限之后,我让它工作。谢谢。 –