【发布时间】:2018-04-16 06:50:28
【问题描述】:
我正在尝试编写一个 Web 门户,用户可以使用它来重置他们自己的 Azure AD 密码。由于我的客户的要求,Azure AD SSPR 不是一个选项。
为了实现这一点,我正在使用 Microsoft Graph。根据the documentation,如果您拥有User.ReadWrite.All 或Directory.AccessAsUser.All 权限,则可以使用Microsoft Graph 重置用户密码。
然后是permissions documentation,它声明即使您拥有Directory.ReadWrite.All 权限,您也无法重置用户密码。
我已经进行了测试,看看这是否可行,但我收到了 HTTP 403 Forbidden 响应。
我使用的代码是:
string ResourceUrl = "https://graph.windows.net/";
string AuthorityUrl = "https://login.microsoftonline.com/companyxxx.onmicrosoft.com/oauth2/authorize/";
//Create a user password cradentials.
var credential = new Microsoft.IdentityModel
.Clients
.ActiveDirectory
.UserPasswordCredential("username@xxxx.com", "passwordxxx");
// Authenticate using created credentials
var authenticationContext = new AuthenticationContext(AuthorityUrl);
var authenticationResult = authenticationContext
.AcquireTokenAsync(ResourceUrl, "xxxxxxxx-3017-4833-9923-30d05726b32f", credential)
.Result;
string jwtToken = authenticationResult.AccessToken;
var cred = new Microsoft.Rest
.TokenCredentials(authenticationResult.AccessToken, "Bearer");
HttpClient client = new HttpClient();
var queryString = HttpUtility.ParseQueryString(string.Empty);
queryString["api-version"] = "1.6";
client.DefaultRequestHeaders
.Accept
.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", jwtToken);
var uri = "https://graph.windows.net/xxxxxxxx-18fe-xxxx-bb90-d62195600495/users/xxxxxxxx-aa58-4329-xxxx-b39af07325ee?" + queryString;
//var content = new StringContent("{\"passwordProfile\": {\"password\": \"Test123456\", \"forceChangePasswordNextLogin\": true }}");
var response = client.PatchAsync(new Uri(uri), content, jwtToken);
PatchAsync 方法是一个扩展方法,如下:
public static class HttpClientExtensions
{
public static async Task<HttpResponseMessage> PatchAsync(this HttpClient client,
Uri requestUri, HttpContent iContent, string jwtToken)
{
var method = new HttpMethod("PATCH");
var request = new HttpRequestMessage(method, requestUri)
{
Content = iContent,
};
request.Content.Headers.ContentType =
new MediaTypeHeaderValue("application/json");
request.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", jwtToken);
HttpResponseMessage response = new HttpResponseMessage();
try
{
response = await client.SendAsync(request);
}
catch (TaskCanceledException e)
{
Console.WriteLine("ERROR: " + e.ToString());
}
return response;
}
}
有人可以澄清一下这是否可以使用带有用户名和密码的凭据授予流程进行身份验证。如果是这样,我该如何实现?
【问题讨论】:
-
您是否检查过 JWT 是否包含必要的范围?您可以使用jwt.ms 之类的工具来解码令牌。
标签: c# azure-active-directory microsoft-graph-api