使用 Owin 针对 Azure AD 对用户进行身份验证后,我如何以该用户身份静默访问 CRM Online Web API?

After authenticating a user against Azure AD using Owin how can I silently access CRM Online Web API as this user?

我正在使用 Microsoft.Owin 中间件在用户访问我的页面时根据 Azure AD 对其进行身份验证。

App_Start > Startup.cs

using Owin;
using System.Configuration;
using System.Globalization;
using Microsoft.Owin;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Cookies;
using Microsoft.Owin.Security.OpenIdConnect;
using Microsoft.Owin.Extensions;

[assembly:OwinStartup(typeof(MyApp.App_Start.Startup))]
namespace MyApp.App_Start
{
    public class Startup
    {
        private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
        private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
        private static string tenant = ConfigurationManager.AppSettings["ida:Tenant"];
        private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"];

        string authority = string.Format(CultureInfo.InvariantCulture, aadInstance, tenant);

        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
        }

        public void ConfigureAuth(IAppBuilder app)
        {
            app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
            app.UseCookieAuthentication(new CookieAuthenticationOptions() { });

            app.UseOpenIdConnectAuthentication(
                new OpenIdConnectAuthenticationOptions
                {
                    ClientId = clientId,
                    Authority = authority,
                    PostLogoutRedirectUri = postLogoutRedirectUri,
                    Notifications = new OpenIdConnectAuthenticationNotifications
                    {
                        AuthenticationFailed = (context) =>
                        {
                            context.HandleResponse();
                            context.Response.Redirect("/Error/message=" + context.Exception.Message);

                            return System.Threading.Tasks.Task.FromResult(0);
                        }
                    }
                });

            app.UseStageMarker(PipelineStage.Authenticate);
        }
    }
}

这工作正常,他们登录后我可以使用 ClaimsPrincipal 之类的东西来获取有关此用户的信息,例如他们的 ID:

string signedInUserID
    = ClaimsPrincipal.Current.FindFirst(System.IdentityModel.Claims.ClaimTypes.NameIdentifier).Value;
string tenantID
    = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;
string userObjectID
    = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;

我现在想以该用户的身份对 CRM Online 进行静默身份验证,以便我可以从 Web 中提取数据 API。这可能吗?如果可能,怎么做?


我一直在尝试按照示例通过 AuthenticationContext 获取访问令牌,我似乎成功了,但是后来我无法查询 CRM Online,我遇到了各种关于安全的错误。为了简洁起见,我不会在这里列出所有代码,除非有人特别需要查看它。 Here's the MSDN article that gives the basics.

我可以使用 CrmConnection class 和连接字符串访问 CRM Online,其中用户名和密码硬编码在 as documented in this MSDN article 中,但这不是我想要的。我想验证为当前登录的用户。

以下是我一直尝试遵循的一些示例,以防它们对其他人有用:https://github.com/azure-samples?query=active-directory

这是我找到的最接近我想要的 post 但它仍然需要 username/password...

CRM Online 似乎不支持任何类型的匿名或被动身份验证,必须始终提供有效的用户名和密码。

我只为 API 访问创建了一个用户,并使用这些凭据通过 CRM 进行身份验证。虽然这不是我想要的,但它确实可以正常工作。

我希望有人能证明我是错的,但现在看来这不可能。