我有一个与WebAPI对话的Angular应用程序,用户通过Azure Active Directory进行身份验证
我按照这里的示例https://github.com/Azure-Samples/active-directory-angularjs-singlepageapp-dotnet-webapi,并能够针对AD验证用户身份并将其传递给Web API.
但是,我想访问Web API中的Graph API并获取当前用户配置文件信息.我该如何设置?
更新以提供有关设置的更多上下文:
我有一个网站(site.domain1.com),它承载制作SPA应用程序的html和javascript文件.我在api.domain2.com上托管了Web API.使用OAAL隐式流与ADAL.js和angular-adal对Azure AD进行身份验证.我想在SPA中进行身份验证以获取API的accessToken.我希望在API中作为查询Graph API的请求的一部分,以获取有关当前用户登录的更多信息.
我能够获得API的accessToken,并且它当前生成了Claim Principal.问题是使用Web API中的当前标识查询Graph API.
更新:
我不想将管理员权限授予Web API,但我更愿意将用户同意仅从浏览器转发到网站和Web api的"读取用户配置文件".
我使用类似的方法来代表这里的样本https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof
它适用于我的测试AD并且不适用于生产AD的问题.说用户需要在使用Graph Api之前集中应用程序.(对于生产AD我只有用户可以添加用户权限但不能添加应用程序权限.我的猜测是该方案工作我需要AD的全局管理员首先集中).最终,我最终将Web站点和Web API的Azure AD应用程序合并在一起,并使用与Bootstrap Tokens相同的On Behalf Of方法.但我想知道如何使它与2个应用程序正常工作.
id_token包含名称为 的声明。unique_name其价值似乎与索赔的价值相同upn。哪个用户实体属性提供此声明的值?
我正在尝试调用 graph api 来获取用户信息。我首先使用邮递员获取令牌,然后使用该令牌尝试向图形 api 发出请求
我通过以下发布请求获得了令牌,并有 4 个关键值grant_type, client_id, client_secret and resource.
https://login.microsoftonline.com/{{tenantid}}/oauth2/token
Run Code Online (Sandbox Code Playgroud)
响应是
{
"token_type": "Bearer",
"expires_in": "3600",
"ext_expires_in": "3600",
"expires_on": "1555583717",
"not_before": "1555579817",
"resource": "https://management.azure.com/",
"access_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxNiIsIng1dCI6IkhCeGw5bUFlNmd4YXZDa2NvT1UyVEhzRE5hMCIsImtpZCI6IkhCeGw5bUFlNmd4YXZDa2NvT1UyVEhzRE5hMCJ9.yyyyyyyLTBjYjZmZDNiM2UwNCIsInRpZCI6IjM3NGY4MDI2LTdiNTQtNGEzYS1iODdkLTMyOGZhMjZlYzEwZCIsInV0aSI6ImVWTWdDbkU4QWtPVXY3bFQ2QlRSQUEiLCJ2ZXIiOiIxLjAifQ.kxHCm2oGsuUvlXbncXQe7Wb0l-ZENqqG9_P_co0SPdYA3GkhFKDi6sQ7OaaHeDs4S6kN0-Diw5qBOzmFipSA5EUorA7UDbJfiSVVlaEzLY3IX_4WSV4Exc-kLOaX0j7KgvsEQbc5TEk8e4dPfokG98gGPmhy19xLyV84lX1v6DzgXINzP8gPkGmqR_J7iVFQ3m-Y18dHlxDpqQMTKxvQGnrsa7rflyxGUwEwwFZJH8t5NRv_mjQOIQBuosfhMAH88l-J8zEmXWLFqEzFBBWrz9UxT6X-XxRQZW4WBSoHTKd3vuBcEo6kUclfe4G7COOvI4zG0-j10mmGziKlzjNVMw"
}
Run Code Online (Sandbox Code Playgroud)
然后我使用令牌发出 GET 请求
https://graph.windows.net/{{company}}/users/{{email}}?api-version=1.6
Run Code Online (Sandbox Code Playgroud)
和标题
Key Value
Authorization Bearer {{token}}
Run Code Online (Sandbox Code Playgroud)
但它因这个错误而失败
{
"odata.error": {
"code": "Authentication_MissingOrMalformed",
"message": {
"lang": "en",
"value": "Access Token missing or malformed."
}
}
}
Run Code Online (Sandbox Code Playgroud)
向 graph api 发出请求的正确方法是什么?
继上一个问题之后:在ADAL JS中使用Azure AD和OAuth2隐式授权进行组声明,我已经设置了一些内容,以便用户可以使用Azure/ADAL JS进行身份验证,然后使用他们的令牌访问Azure Graph API代表那个用户.这很好用,我可以获得他们的用户和组信息.
但是,我们现在有一个用例,其他系统将在应用程序的上下文中而不是作为单个用户登录我们的应用程序.我不知道我是否正确地进行了操作但是我有第二个Azure AD应用程序,其客户端密钥通过从AAD API请求令牌进行身份验证.我可以获得一个令牌并将其传递给我们的应用程序.但是,我不能再使用该令牌代表该用户(现在是应用程序)访问Azure Graph API.
首先,这实际上是可行的,还是我尝试不可能的?
如果有可能,我必须采取哪些不同的方式才能使其发挥作用?它只是Azure应用程序中的权限还是我需要在代码中以不同方式执行?
我用来代表用户访问Graph API的代码(删除了异常处理和空检查)是:
var authContext = new AuthenticationContext("https://login.microsoftonline.com/common");
var clientCredential = new ClientCredential("clientId", "key");
var userAssertion = new UserAssertion(((BootstrapContext)identity.BootstrapContext).Token);
var result = await authContext.AcquireTokenAsync("https://graph.windows.net", clientCredential, userAssertion);
return result.AccessToken;
Run Code Online (Sandbox Code Playgroud)
我得到的例外是AADSTS50034: To sign into this application the account must be added to the {directory ID of my main application} directory错误invalid_grant.
我似乎无法弄清楚我做错了什么,因为我相信所有Azure应用程序都配置正确,至少它们用于用户身份验证.我还将相同的应用程序和委派权限应用于我的第二个Azure AD(客户端)应用程序,其他目录需要用户身份验证.
任何帮助,将不胜感激.
所以我似乎没有提供关于系统配置方式的足够上下文,所以让我试着在这里解决这个问题.
我们有一个在Azure中运行的企业SaaS应用程序(我们称之为我们的应用程序).它在Azure AD中有一个"应用程序"(让我们称之为我们的AAD应用程序以避免混淆).这是一个多租户AAD应用程序,用户通过AAD使用OAuth2进行身份验证.
作为企业应用程序,我们的客户都拥有自己的Azure …
当我尝试检索用户时,用户的经理对象始终为null.但我得到"objectId",这是相应的管理员(用户)GUID.我可以使用此GUID从API调用或https://graphexplorer.cloudapp.net获取Manager,但不能使用C#从Graph Client获取(即使使用2.1.0版本:https://www.nuget.org/packages/Microsoft .Azure.ActiveDirectory.GraphClient).
有人可以指导我吗?提前致谢.
我正在尝试使用Azure CLI在Azure AD应用程序中添加密钥.但是看看Azure CLI API似乎没有这样的命令.
例如:
我正尝试通过Azure CLI从以下链接自动执行任务:http: //blog.davidebbo.com/2014/12/azure-service-principal.html
我可以创建AD应用程序,服务主体,但我找不到为新创建AD应用程序添加密钥的方法.
我会感谢任何想法和方向:)
提前致谢 !
我正在尝试使用Sample Graph API应用程序来更改用户的密码,但我得到了:
调用Graph API响应时出错:
{
"odata.error": {
"code": "Authorization_RequestDenied",
"message": {
"lang": "en",
"value": "Insufficient privileges to complete the operation."
}
}
}
Run Code Online (Sandbox Code Playgroud)
图形API请求:
PATCH /mytenant.onmicrosoft.com/users/some-guid?api-version=1.6 HTTP/1.1
client-request-id: ffd564d3-d716-480f-a66c-07b02b0e32ab
date-time-utc: 2017.08.10 03:04 PM
Run Code Online (Sandbox Code Playgroud)
JSON文件
{
"passwordProfile": {
"password": "Somepassword1$",
"forceChangePasswordNextLogin": false
}
}
Run Code Online (Sandbox Code Playgroud)
我已经测试过更新用户displayName,并且工作正常.
{
"displayName": "Joe Consumer"
}
Run Code Online (Sandbox Code Playgroud)
AD应用程序权限
oauth-2.0 azure-active-directory azure-ad-graph-api azure-ad-b2c
如果声明存储在自己的服务器上某个位置(在B2C中不可用),那么在Azure AD B2C中将自定义声明(用户订阅或角色列表作为示例)包含在令牌中的方法有哪些?目标是在令牌中提出索赔,以避免在每次请求时额外往返存储.
对该主题的调查使我有以下方式:
通过Graph API添加自定义属性,配置为包含在JWT中.属性值应与我们的数据存储保持同步.
自定义登录策略,如本文https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-rest-api-step-custom,但如果我说得对,附加步骤6是以非限制方式访问公开API的用户之旅(请求不是通过秘密保护,可能用于通过呈现的UserId获取用户声明)?
IdentityServer4联合网关http://docs.identityserver.io/en/release/topics/federation_gateway.html允许在发布之前添加任何声明.
我正在对Azure Active Directory的web api用户进行身份验证.现在我想获得该用户所属的组列表.
我更改了应用程序清单以包含
"groupMembershipClaims": "All",
Run Code Online (Sandbox Code Playgroud)
但所有这一切都是添加声明hasGroups但没有组名.
我在门户网站中为我的应用程序授予了Windows Azure Active Directory的所有(8)委托权限.
更新
我已经能够使用此线程的指令获得Bearer令牌
以下是邮递员的说明:
但是,如果我在调用Web API端点时发送相同的令牌,我仍然会回复" 此请求已拒绝授权 "
为什么还没有授权?
结束更新
我创建了一个ASP.Net Web API项目,该项目使用组织Azure AD实例进行保护.我已正确设置了租户ID,客户端ID和密码.
Azure AD实例与支持Office 365/SharePoint实例的实例相同,其目的是创建可以使用登录用户的上下文调用服务的SharePoint加载项.
我坚持测试API.我可以毫无问题地调用未经授权的端点.但是,当我添加[Authorize]属性时,我总是回复此响应:" 此请求已拒绝授权. "
据我了解,我需要生成一个不记名令牌并将其添加到标题中的Postman请求中(参见图片).经过大量的谷歌搜索,我仍然无法完成这项工作.
我的问题是:如何为受Azure AD保护的Web API实例生成承载令牌.
我的配置代码如下:
public void ConfigureAuth(IAppBuilder app)
{
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
TokenValidationParameters = new TokenValidationParameters {
ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
},
});
}
Run Code Online (Sandbox Code Playgroud)