2016-05-17 15 views
0

Ich versuche, eine Seite in ASP.Net MVC zu erstellen, um das aktuelle Benutzerkennwort zurückzusetzen. Ich verwende Azure Active Directory für die Benutzerauthentifizierung. Um auf die AD-Informationen des Benutzers zuzugreifen, verwende ich den C# Graph API-Client. Mein Code basiert auf einem Muster, das auf GitHubBerechtigungsproblem ändern Benutzerpasswort mit Azure AD Graph Client API

gefunden wurde. Ich bin in der Lage, Änderungen an den Benutzerinformationen (wie Stadt, Bundesland, E-Mail) vorzunehmen. Wenn ich versuche, das Kennwort mithilfe des PasswordProfile-Attributs für das Benutzerobjekt zu ändern, erhalte ich die Fehlermeldung, dass ich nicht über ausreichende Berechtigungen verfüge. Ich versuche, das Kennwort als die Anwendung zu ändern, und ich glaube, dass die Quelle des Berechtigungsproblems mit der Anwendung ist.

Ich habe das folgende PowerShell-Skript gefunden, das die Firmenadministratorrolle zu einer Anwendung hinzufügen soll. Der Aufruf von Get-MsolServicePrincipal gibt jedoch nichts zurück. Wenn ich die Ausgabe des Befehls betrachte, sehe ich keine Einträge, die dem Namen meiner Anwendung ähneln.

Ich denke, meine erste Frage ist, bin ich richtig, dass die Erlaubnis Problem mit der Anwendung ist?

Zweitens, welchen Wert, auf den ich die Variablen $ displayName setzen sollte?

Antwort

2

Sie müssen sicherstellen, dass die Anwendungskonfiguration in Azure Active Directory über die erforderlichen Berechtigungseinstellungen verfügt. Hinzufügen der Rechte mit dem, was Sie oben haben, ist Overkill. Sie sollten die erforderlichen Berechtigungen nur für Ihre Anwendung im Verzeichnis hinzufügen.

Als Ausgangspunkt würde ich vorschlagen, dass Sie den Graph API Consent Permission Blogpost hier überprüfen. Sie können ein Kennwort nur als Benutzerkonto oder globaler Administrator mit herkömmlichen Rechten zurücksetzen, sollten jedoch Anwendungsberechtigungen zuweisen.

"Lesen und Schreiben von Verzeichnisdaten" verwendet, um diese Erlaubnis zu geben, aber ich glaube, das wurde entfernt. Jetzt glaube ich, dass der Benutzer der Verwendung des OAuth-Authentifizierungsflusses zustimmen muss, um ein Passwort zurücksetzen zu können.

Weitere Informationen hierzu finden Sie in der Methode changePassword des aktuell angemeldeten Benutzers. Ich habe eine benutzerdefinierte Desktop-Anwendung für Benutzer, um ihre eigenen Passwörter zurückzusetzen.

In meiner Anwendung habe ich die Benutzer authentifizieren, um ein Zugriffs-Token mit ihrem vorhandenen Passwort zu erhalten (dies hilft mir auch ihre aktuellen Anmeldeinformationen zu überprüfen, bevor Sie das Passwort ändern).

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; 

Die Berechtigung Eigenschaft ist eine UserCredential Art des Benutzer UPN und Passwort. Ich gebe dann eine Web-Anfrage, um das Passwort zu ändern.

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; 

Dies gibt eine HTTP 204, wenn die Anforderung erfolgreich war, habe ich auch eine Falle AADSTS50126 Ausnahme, wenn der Benutzer-Token, da dies immer zeigt die Anmeldeinformationen ungültig sind, wenn das Token zu erhalten.

+0

Können Sie erweitern, wie Sie das UserCredential erstellen? Die einzige Eigenschaft und der Konstruktor, die ich sehe, ist für einen Benutzernamen. Gibt es einen Unterschied zwischen Desktop-Anwendungs- und Webanwendungsbibliotheken? –

+0

Ich glaube nicht, dass ein Unterschied existiert nein, hier sind einige Informationen zur Verwendung von 'UserCredential' ... http://www.cloudidentity.com/blog/2014/07/08/using-adal-net-to-authenticate -users-via-benutzernamepassword/Grundlegende Verwendung ist aber ...'var credential = new UserCredential (" Benutzername "," Passwort ");' –

+0

Aus irgendeinem Grund hat UserCredential nicht zwei Konstruktoren für mich, aber UserPasswordCredential macht den Trick. Nachdem ich meine Konstanten und Berechtigungen optimiert habe, funktioniert es. Vielen Dank. –

Verwandte Themen