繁体   English   中英

使用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这样的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,我收到各种关于安全性的错误。 为简洁起见,我不会在此列出所有代码,除非有人特别需要查看它。 这是MSDN文章,提供了基础知识

我可以使用CrmConnection类访问CRM Online,并使用硬编码的用户名和密码连接字符串, 如本MSDN文章中所述,但这不是我想要的。 我想作为当前登录用户进行身份验证。

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

这是我发现的最接近我想要的帖子,但它仍然需要用户名/密码... 使用ADAL C#作为机密用户/守护程序服务器/服务器到服务器 - 401未经授权

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

我只是简单地创建了一个仅用于API访问的用户,并使用这些凭据对CRM进行身份验证。 虽然这不是我想要的,但确实可行。

我喜欢有人证明我错了,但现在似乎不可能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM