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

如何在Connect应用程序中以编程方式对Azure Active Directory进行身份验证?

范翰海
2023-03-14

我试图编写一个连接应用程序,将从外部来源接收一组数据,并通过其API将其放在microsoft dynamics 365 business central的实例中。文档说明有两种方法可以做到这一点,使用基本身份验证和通过Azure Active Directory登录。前者以编程方式简单明了,但文档非常清楚地表明,它不适用于生产环境。我可以使用邮递员来完成后一种操作,但过程的一部分涉及到我在弹出窗口中键入凭据。因为最终产品的用例将在没有用户交互的情况下运行,所以这是不行的。我希望应用程序自己处理服务帐户的凭据。

我可以使用基本身份验证和active directory修改记录,如果我在提示时填写登录表单。我曾尝试使用一个名为ADAL的库,但以这种方式传递我的帐户凭据会导致以下响应:{“error”:“invalid_request”,“error_description”:“AADSTS90014:请求正文必须包含以下参数:'client_secret或client_assertion.}我可以访问客户端机密,但似乎无法通过ADAL传递它。

在一位同事的建议下,我还尝试使用客户端id和客户端机密作为用户名和密码登录。下面的代码是我们最后得到的:

RestClient client = new RestClient("https://login.windows.net/[my tenant domain]/oauth2/token?resource=https://api.businesscentral.dynamics.com");
            var request = new RestRequest(Method.POST);
            request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
            request.AddParameter("undefined", "grant_type=%20client_credentials&client_id=%20[my client id]&client_secret=[my client secret]&resource=[my resource]", ParameterType.RequestBody);
            string bearerToken = "";
            try
            {
                bearerToken = JsonConvert.DeserializeObject<Dictionary<string, string>>(client.Execute(request).Content)["access_token"];
                Console.WriteLine(bearerToken);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

上面的代码成功地检索了一个令牌,但是如果我使用该令牌,我会得到以下响应:

<error xmlns="http://docs.oasis-open.org/odata/ns/metadata"><code>Unauthorized</code><message>The credentials provided are incorrect</message></error>

共有1个答案

柴彬
2023-03-14
using System.DirectoryServices.AccountManagement;

public class ActiveDirectoryService {
    // The domain url is the url of the active directory server you're trying to validate with.
    public bool ValidateWithActiveDirectoryAsync(string domainUrl, string userName, string password) {
        using (var context = new PrincipalContext(ContextType.Domain, domainUrl)) {
            UserPrincipal UserPrincipal1 = new UserPrincipal(context);
            PrincipalSearcher search = new PrincipalSearcher(UserPrincipal1);
            if (context.ValidateCredentials(userName, password)) {
                return true;
            }
        }
        return false;
    }
}
 类似资料:
  • 我如何以编程方式验证Google?既然ClientLogin(https://developers.Google.com/accounts/docs/authforinstalledApps)已被否决,那么我们如何使用OAuth2对Google执行编程身份验证呢? 使用ClientLogin,我们可以使用电子邮件和密码参数执行到https://www.google.com/accounts/Cli

  • 问题内容: 如何以编程方式向Google进行身份验证?现在不推荐使用ClientLogin(https://developers.google.com/accounts/docs/AuthForInstalledApps),我们如何使用OAuth2对Google执行编程身份验证? 使用ClientLogin,我们可以 使用电子邮件和密码参数在https://www.google.com/accou

  • 我正在开发一个JavaFX应用程序,并试图使用WebView访问一个web应用程序。这个web应用程序有基本的身份验证,我想通过编程提交凭据(不想提示用户提供他的凭据,它们存储在JavaFX应用程序中,我知道这种方法的安全含义)。 我在谷歌上找到的唯一链接是: https://community.oracle.com/message/12518017 还没有答案。

  • 问题内容: 有什么方法可以使用我自己的用户名和密码页面通过Web应用程序或Web API登录到Azure Active Directory(具有AD凭据)吗? 根据我的调查,似乎没有通过编程的方式发送用户名和密码来使用Azure AD对用户进行身份验证(如果您在Azure之外托管了一个应用程序)不知道他们是否认为这是某种安全漏洞(我不认为这强制执行https吗?) 似乎您只能通过执行代码授权来对用

  • 似乎您只能通过代码授权来验证用户身份(这意味着跳出我们的应用程序来登录到外部站点)。 最终,我希望创建一个python flask api,如果可能的话,它可以直接对Azure AD进行身份验证。我以前(在其他身份验证系统中)用Oauth grant_type=password发送用户名并通过,但认为Azure AD不支持这一点(如果我错了,请更正我?)我知道支持grant_type=client

  • 问题内容: 有没有办法以编程方式对JTable进行排序? 我的JTable排序工作正常(使用setRowSorter),以便当用户按任意列时,表将被排序。 我知道,SWingX JXTable可能可以工作,但我不想麻烦,因为其他所有事情现在都可以正常工作,而且我不知道NetBeans的可视化编辑器如何处理JXTable等。 编辑: 选定的答案是指我的声明(现已删除),该声明对Sun的页面的答案不起