2017-03-09 13 views
0

私は、紺碧のADとグラフのAPIについては、特定の質問があります。Azure ADでは、一時パスワードを使用してパスワードの変更要求を送信するにはどうすればよいですか?

私はAPIに簡単なパスワード変更要求をしています。これは、ユーザーがログインできるときに機能しますが、ユーザーがポータルを介して一時パスワードにパスワードをリセットした場合、次にログインするときにパスワードを変更する必要があります。私は、パスワード変更要求を送信することが出来るのですか、私は認証トークンを取得することができないのであれば

AADSTS50055: Force Change Password. 

:私はこれを持っている問題は、ときに例外が返され、そのユーザーの認証トークンを取得しようとしていますユーザーが自分のアプリ内で自分のパスワードを変更できるようにGraph APIを使用していますか?以下は

は、すでにログインすることができ、ユーザーにパスワードを変更するための私のコードです:

public SendPasswordChangeRequest(string userId, string newPass, string oldPass) { 
    try { 
     HttpClient http = new HttpClient(); 
     string action = string.Format("https://stackoverflow.com/users/{0}/changePassword", user.DistinguishedName); 
     string url = string.Format("https://graph.windows.net/{0}{1}?api-version=1.6", tenantId, action); 
     object bodyObject = new { currentPassword = oldPass, newPassword = newPass }; 
     string body = JsonConvert.SerializeObject(bodyObject); 

     HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url); 
     request.Content = new StringContent(body, Encoding.UTF8, "application/json"); 

     AuthenticationContext authContext = new AuthenticationContext(string.Format("https://login.windows.net/{0}", tenantName)); 
     UserPasswordCredential credential = new UserPasswordCredential(userId, oldPass); //userId and oldPass are parameters passed in 

     AuthenticationResult authResult = authContext.AcquireTokenAsync("https://graph.windows.net/", clientId, credential).Result; 
     request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken); 

     HttpResponseMessage httpResponse = http.SendAsync(request).Result; 
    } 
    catch (Exception ex) { 
     //authResult throws the error into here 
     //Error returned from Azure AD: 
     //AADSTS50055: Force Change Password. 
    } 
} 

答えて

1

短い答えは:あなたがすることはできません。

これは、対話型認証フローのいずれかを使用できる状況では、ユーザー名とパスワードのフローの使用をお勧めしません。このパターンが起動されているものであるOAuth 2.0 spec、(強調追加)から:

リソース所有者のパスワード資格証明(すなわち、ユーザ名とパスワード)は、アクセストークンを取得するために認可グラントとして直接使用することができます。資格情報は、リソース所有者とクライアント間の信頼度が高い場合(たとえば、クライアントがデバイスオペレーティングシステムの一部または高度に権限のあるアプリケーションの場合)、と他の認可許可タイプが使用できない場合にのみ使用する必要があります(認証コードなど)

アプリケーションがネイティブ・クライアント・アプリケーション(すなわち、リッチクライアントアプリケーション)である場合は、サインインアズールAD-ホストされているサインインページでプロンプトをポップアップAcquireTokenフローのいずれかを呼び出す必要があります。これにより、ユーザーはパスワードを変更する機会が与えられます(マルチファクター認証などの他の割り込みも許可されます)。

その他のシナリオ(ウェブアプリ、シングルページアプリなど)の場合は、Authentication Scenarios for Azure ADに追加の詳細があり、サンプルと追加の参照はAzure Active Directory developer's guideにあります。

+0

ありがとうございます!それは私が恐れていたものです。うまくいけば、この答えは他の人が同じ質問をするのを助けてくれるはずです。 – YourbrainonCompSci

関連する問題