使用 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 进行身份验证。虽然这不是我想要的,但它确实可以正常工作。
我希望有人能证明我是错的,但现在看来这不可能。
我正在使用 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 进行身份验证。虽然这不是我想要的,但它确实可以正常工作。
我希望有人能证明我是错的,但现在看来这不可能。