我们正在Azure中开发一个具有AngularJS前端和Web API后端的多租户SaaS产品.我们使用Azure AD进行身份验证,并使用ADAL JS(使用OAuth2隐式授权)将其连接起来.作为多租户应用程序,我们允许客户针对自己的Azure AD进行身份验证(可能与也可能未连接到内部部署AD).
到目前为止,这一切都很好.ADAL JS将用户带到Azure登录页面,一旦用户通过身份验证,就会发出OAuth2令牌.然后,此JWT令牌随所有API调用一起作为承载令牌发送,我们拥有自己的声明转换过程,用于将来自Azure的传入声明映射到我们的应用程序声明.
我们尝试按AD组进行操作,而不是在声明转换过程中指定单个用户.这允许我们的客户在他们的AD中安装安全组,然后我们的应用程序将使用它来映射到正确的应用程序声明.
我们收到的JWT令牌不包含groups财产,尽管有设置groupMembershipClaims于SecurityGroup在AAD应用程序清单.我从维托里奥的这条推文中读到了这一点
隐式授权不会发送这些声明,因为它返回查询字符串中的标记 - 它很容易超过最大长度
经过进一步调查,我还发现Vittorio的这个StackOverflow答案说
我验证了,在隐式授权案例中,您将始终通过超额索赔接收组.请参阅https://github.com/AzureADSamples/WebApp-GroupClaims-DotNet/tree/master/WebApp-GroupClaims-DotNet-它将向您展示如何处理超额索赔以检索组.
我查看了JWT令牌,它不包括任何超额索赔(由_claim_names和标识_claim_sources).我肯定是Azure AD中两个组的成员.
我现在似乎还有两个相互矛盾的陈述,即是否有可能在隐式授权令牌中获取组信息(无论是直接还是间接).
问题1:我是否应该获得可用于获取群组信息的超额索赔?如果是这样,我是否需要做任何事情以确保将索赔发送给我?
我是否可以通过图API中的用户链接获得超额索赔,或者我是否必须手动创建链接以获取用户的组,我仍然不确定如何使用图API进行身份验证.
我需要在收到带有承载令牌的请求(来自ADAL JS)后从后端联系图API.
问题2:我可以将相同的承载令牌发送到图形API以读取该用户的目录信息吗?或者我是否需要在应用程序的上下文中直接从我的应用程序到图形API租户而不是用户进行身份验证?
我正在尝试使用Azure AD oAuth 2身份验证访问Dynamics CRM Online REST API.为了做到这一点,我按照以下步骤操作:
- 我在Azure中注册了一个Web应用程序和/或web api
- 将动态CRM的权限配置为具有委派权限"以组织用户身份访问CRM Online"
- 并创建了一个密钥1年到期并保留客户ID.
在Azure上配置Web应用程序后,我在.NET/C#中创建了一个控制台应用程序,它使用ADAL发出简单请求,在这种情况下检索帐户列表:
class Program
{
private static string ApiBaseUrl = "https://xxxxx.api.crm4.dynamics.com/";
private static string ApiUrl = "https://xxxxx.api.crm4.dynamics.com/api/data/v8.1/";
private static string ClientId = "2a5dcdaf-2036-4391-a3e5-9d0852ffe3f2";
private static string AppKey = "symCaAYpYqhiMK2Gh+E1LUlfxbMy5X1sJ0/ugzM+ur0=";
static void Main(string[] args)
{
AuthenticationParameters ap = AuthenticationParameters.CreateFromResourceUrlAsync(new Uri(ApiUrl)).Result;
var clientCredential = new ClientCredential(ClientId, AppKey);
var authenticationContext = new AuthenticationContext(ap.Authority);
var authenticationResult = authenticationContext.AcquireToken(ApiBaseUrl, clientCredential);
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authenticationResult.AccessToken); …Run Code Online (Sandbox Code Playgroud) 我在尝试序列化令牌缓存时遇到了一些问题,通过 MSAL 进行身份验证返回。我将不胜感激,因为我真的不明白我做错了什么。这是我们的情况/问题:
我们目前正在使用 ADAL 来允许用户从我们的桌面应用程序对其 SharePoint Online 帐户进行身份验证,但希望切换到 MSAL。
我们已经实现了两种可能的身份验证流程。一个 publicClientApplication,允许用户使用其当前活动的 Microsoft 凭据和 ConfidentialClientApplication 进行身份验证,允许使用证书进行身份验证,如您在以下代码的 catch 块中所见:
try
{
Debugger.Launch();
if (certificate != null)
{
IConfidentialClientApplication m_authContext = ConfidentialClientApplicationBuilder.Create(pClientID)
.WithTenantId(m_tenant).WithCertificate(certificate).WithRedirectUri(pClientRedirectURI).Build();
var accounts = await m_authContext.GetAccountsAsync();
authResult = await m_authContext.AcquireTokenSilent(m_scope, accounts.FirstOrDefault()).ExecuteAsync();
}
else
{
IPublicClientApplication m_authContext = PublicClientApplicationBuilder.Create(pClientID).WithTenantId(m_tenant).WithRedirectUri(pClientRedirectURI).Build();
var accounts = await m_authContext.GetAccountsAsync();
authResult = await m_authContext.AcquireTokenSilent(m_scope, accounts.FirstOrDefault()).ExecuteAsync();
}
}
catch
{
if (certificate != null)
{
IConfidentialClientApplication m_authContext = ConfidentialClientApplicationBuilder.Create(pClientID)
.WithTenantId(m_tenant).WithCertificate(certificate).WithRedirectUri(pClientRedirectURI).Build();
TokenCacheHelper.EnableSerialization(m_authContext.AppTokenCache);
authResult = await m_authContext.AcquireTokenForClient(m_scope).WithForceRefresh(true).ExecuteAsync();
}
else
{ …Run Code Online (Sandbox Code Playgroud) 我正在尝试设置一些.NET应用程序,以便对Azure Active Directory使用基于证书的身份验证,然后使用Active Directory授权我访问Sql Azure数据库.
我遇到的问题是应用程序的某些部分使用的DbContext可能有点太长.如果您在访问令牌到期后的5分钟内请求访问令牌,则ADAL库会尝试刷新访问令牌.麻烦的是我的一些DbContexts可能活超过5分钟.因此,在DbContext的生命周期中,访问令牌不再好,当我尝试SaveChanges时,我得到一个数据库连接异常.
除了重构使我的DbContexts活动时间短于5分钟,我还能做些什么来解决这个问题吗?
我尝试过的一件事是在实体框架中找到一些钩子,我可以捕获过期的访问令牌异常,然后用新创建的具有新访问令牌的连接替换当前连接.我尝试传递EF自定义连接工厂,然后使用执行策略在我收到过期令牌异常时重试.这对我不起作用,因为我无法从自定义执行策略修改或重新创建当前连接.
任何想法将不胜感激.
谢谢!
我有一个angularjs SPA网络应用程序,它使用ADAL-JS(和adal-angular).它设置为在MS Azure中对我们的公司AD进行身份验证.登录流程似乎正常,SPA收到id_token.
接下来,当用户单击按钮时,SPA会向我在AWS API Gateway上托管的REST API发出请求.我在Authorization: Bearer <id_token>标题上传递了id_token .API网关按预期接收标头,现在必须确定给定标记是否良好以允许或拒绝访问.
我有一个示例令牌,它在https://jwt.io/上正确解析但我到目前为止未能找到我应该用来验证签名的公钥或证书.我查了一下:
我想我应该使用https://login.microsoftonline.com/common/discovery/keys中密钥的x5c属性的值来匹配来自JWT id_token的kid和x5t属性(当前a3QN0BZS7s4nN-BdrjbF0Y_LdMM,这导致x5c值开始与"MIIDBTCCAe2gAwIBAgIQY ......").但是,https://jwt.io/页面报告"无效签名"(我也尝试用"----- BEGIN CERTIFICATE -----"和"----- END CERTIFICATE-"包装密钥值----").
另外,是否有一个(可能是python)库可以帮助验证给定的id_token,如上所述(这样我就不必自己去抓取签名密钥了?)...最好的我可以找到(ADAL for python)似乎没有提供此功能?
我正在尝试处理使用Microsoft Graph的应用程序的身份验证.
这两个库有什么区别?
ADAL.js只是一个Angular 1的MSAL.js库吗?
我需要调用这个REST端点
PATCH https://graph.windows.net/contoso.onmicrosoft.com/users/username@contoso.onmicrosoft.com?api-version=1.5 HTTP/1.1
{
"<extensionPropertyName>": <value>
}
Run Code Online (Sandbox Code Playgroud)
请参阅此处的文档:https://msdn.microsoft.com/en-us/library/azure/dn720459.aspx
我有以下代码为用户设置一个属性的值:
public async Task<ActionResult> AddExtensionPropertyValueToUser()
{
Uri serviceRoot = new Uri(azureAdGraphApiEndPoint);
var token = await GetAppTokenAsync();
string requestUrl = "https://graph.windows.net/mysaasapp.onmicrosoft.com/users/usuario1@mysaasapp.onmicrosoft.com?api-version=1.5";
HttpClient hc = new HttpClient();
hc.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
var method = new HttpMethod("PATCH");
var request = new HttpRequestMessage(method, requestUrl)
{
Content = new StringContent("{ \"extension_33e037a7b1aa42ab96936c22d01ca338_Compania\": \"Empresa1\" }", Encoding.UTF8, "application/json")
};
HttpResponseMessage hrm = await hc.GetAsync(new Uri(requestUrl));
if (hrm.IsSuccessStatusCode)
{
string jsonresult = await hrm.Content.ReadAsStringAsync();
return View("TestRestCall", …Run Code Online (Sandbox Code Playgroud) 我建立一个连接处使用365个服务的多租户Web应用程序Microsoft.Owin.Security.OpenIdConnect,版本= 3.0.0.0和天青与Active Directory Microsoft.IdentityModel.Clients.ActiveDirectory,版本= 2.19.0.0下面这个样本.
我们的Web应用程序客户端(用户代理)使用asp.NET cookie对我们的服务器进行身份验证,而我们的服务器和授权服务器(此处为Azure AD)之间的身份验证是使用OpenID授权代码流进行的.
我们为Asp.NET cookie设置了30天的滑动到期时间.但是,即使设置了UseTokenLifetime = true,我们仍然有来自Authority Server的短暂的AuthenticationTicket,它应该与两个身份验证机制的生命周期相匹配.
我们遇到的问题是:我们的最终用户必须经常重新登陆(少于一小时).问题是,我们如何在这个owin openidconnect中间件中增加/更改身份验证票证的生命周期?
备注:我还发布了一个关于ADAL使用刷新令牌的问题.根据我们的理解,此问题仅与身份验证有关.作为ActiveDirectory客户端管理的授权问题的access_token和refresh_token的生存期与此问题无关.如果我错了,请纠正我.
Startup.Auth.cs
public partial class Startup
{
public const string CookieName = ".AspNet.MyName";
public const int DayExpireCookie = 30;
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
var cookieAuthenticationOptions = new CookieAuthenticationOptions()
{
CookieName = CookieName,
ExpireTimeSpan = TimeSpan.FromDays(DayExpireCookie),
AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
SlidingExpiration = true,
};
app.UseCookieAuthentication(cookieAuthenticationOptions);
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = …Run Code Online (Sandbox Code Playgroud) 在ADAL.Net 3.x中,UserPasswordCredential在2.x的UserCredential之上引入.但同一个UserPasswordCredential在同一个nuget包下的.Net Core中没有公开?
UserCredential类只有一个属性UserName
namespace Microsoft.IdentityModel.Clients.ActiveDirectory
{
//
// Summary:
// Credential used for integrated authentication on domain-joined machines.
public class UserCredential
{
//
// Summary:
// Constructor to create user credential. Using this constructor would imply integrated
// authentication with logged in user and it can only be used in domain joined scenarios.
public UserCredential();
//
// Summary:
// Constructor to create credential with client id and secret
//
// Parameters:
// userName:
// Identifier of the user application …Run Code Online (Sandbox Code Playgroud) 我正在编写一个简单的C#移动应用程序,我已在https://apps.dev.microsoft.com/上注册以访问live.com/outlook.com邮箱(不是outlook 365 mbx).我正在使用ADAL进行身份验证,使用客户端ID并从注册中重定向URI.我不确定是否应该从注册网站生成密码以及我应该如何使用生成的密码.我遇到的是我得到通常的提示进行身份验证,我提供了我的凭据,我看到一个令牌被返回(RequestSecurityTokenResponse)我的数据(名字,姓氏等)意味着身份验证过程成功但是身份验证过程以错误" AADSTS50020:我们无法从此api版本为Microsoft帐户发出令牌.请联系应用程序供应商,因为他们需要使用该协议的2.0版本来支持此功能. "
我不确定如何解释错误:错误是说我没有使用协议的v2.0,或者它说我没有调用他们的身份验证端点的v2.0.
我面临的困难是微软已经改变了很多次协议和接口,并混合了live.com/outlook.com和azure/office365,最后我不知道我应该提供什么作为权威网址以及访问live.com/outlook.com邮箱的资源uri.
我注意到的是,除了身份验证UI之外,我没有获得用户界面,我应该授权应用程序代表我.
下面是带有smtp地址模糊处理的传出请求.
这是我用过的代码:
string authority = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize";
PlatformParameters authParms = new PlatformParameters(PromptBehavior.Always, null);
AuthenticationContext authContext = new AuthenticationContext(authority, TokenCache.DefaultShared);
AuthenticationResult result = await authContext.AcquireTokenAsync(
"https://outlook.office.com/mail.read",
clientId,
new Uri(redirectUri),
authParms);
Run Code Online (Sandbox Code Playgroud)