[英]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.