2016-05-17 150 views
0

我正尝试在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变量的值是多少?

回答

2

您需要确保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异常指示获取令牌当凭证无效。

+0

您可以扩展如何创建UserCredential?我所看到的唯一属性和构造函数是用户名。桌面应用程序和Web应用程序库有区别吗? –

+0

我不认为存在差异否,下面是使用'UserCredential'的一些信息... http://www.cloudidentity.com/blog/2014/07/08/using-adal-net-to-authenticate -users-via-usernamepassword /基本用法虽然是...'var credential = new UserCredential(“username”,“password”);' –

+0

由于某种原因,UserCredential对我来说没有两个构造函数,但UserPasswordCredential可以做到这一点。在调整我的常量和权限之后,我让它工作。谢谢。 –