当前位置: 首页 > 知识库问答 >
问题:

使用Azure AD,如何发送带有临时密码的更改密码请求?

柯奕
2023-03-14
AADSTS50055: Force Change Password.

下面是我为已经可以登录的用户更改密码的代码:

public SendPasswordChangeRequest(string userId, string newPass, string oldPass) {
    try {
        HttpClient http = new HttpClient();
        string action = string.Format("/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个答案

苍轶
2023-03-14

简短的回答是:你不能。

这是一个很好的例子,说明了为什么在可以使用任何交互身份验证流的任何情况下都不鼓励使用用户名/密码流。从OAuth2.0规范(也就是此模式所调用的内容)中可以看出:

资源所有者密码凭据(即用户名和密码)可以直接用作获得访问令牌的授权授予。仅当资源所有者和客户端之间存在高度信任时(例如,客户端是设备操作系统或高度特权应用程序的一部分),以及当其他授权授予类型不可用时(例如授权代码),才应使用凭据。

 类似资料:
  • 我无法使用keytool(java 8)更改PKCS密钥库密码。当我试图更改密钥密码时: 这意味着无法更改PKCS12密钥库的密钥密码。然后我尝试更改keystore密码: 这意味着,我们必须一起更改密钥库密码和密钥密码。但是没有命令可以改变两者。我能做什么呢?

  • 如何更改PostgreSQL用户的密码?

  • 我需要用电子邮件和密码提出请求。电子邮件和密码是发送到我的存储库类的字符串。密码需要用Base64编码。 我正在使用改装2。 我知道我需要使用类,但是我怎么才能发出请求呢? 这是来自 Rest 接口的代码: 在存储库中,我用这个对密码进行编码: 但是我需要用email和encodedPassword变量初始化requestBody来发出请求。 这真的是正确的方法吗? requestBody属性是如

  • 问题内容: 我目前有一个密钥库,其中只有我应该知道的特定密码。现在,我需要将对该密钥库的访问权授予其他人,因此我想: 1)更改密码,以便我可以与他人共享该密码并让他们签名 2)创建一个不同的密码并允许他们使用它进行签名。 这可能吗?以及-如果是-怎么样? 问题答案: 密钥库只有一个密码。您可以使用keytool进行更改: 要更改密钥的密码:

  • 问题内容: 我已经在redhat linux上安装了MySQL服务器5。我无法以root用户身份登录,因此无法更改root用户密码。 当我尝试像这样设置一个时: 我收到一个错误: 好像设置了root密码。 我也尝试过使用(此处描述)重置密码。 然后制作: 我什至卸载了mysql-server(使用yum),然后重新安装了它,但这没有帮助。 如何强制重置root密码? 问题答案: 我删除了MySQL

  • 问题内容: 只是知道,是否可以通过Ajax请求安全地发送密码? 我有一个登录框,它调用ajax请求来尝试登录/传递并检索带有错误(如果有)的JSON对象。 我应该改用表单重定向吗? [编辑] 将加密的密码存储在数据库中不是解决方案,因为ajax发送的登录名和密码是访问数据库本身(内部应用程序)的登录名/密码。 问题答案: 发送第三方无法拦截的内容的唯一方法是使用HTTPS而不是常规HTTP。这样,