我从问题开始。如何使用Microsoft Graph使用在Azure AD内部执行的应用程序注册从AAD读取数据?现在细节......
我在Azure Active Directory中创建了一个应用注册,并允许在那里访问Microsoft Graph:
确切地说,该应用具有以下权限:
我在ASP.NET MVC应用程序中使用以下代码来根据AAD验证我的网站:
public void SignIn()
{
if (!Request.IsAuthenticated)
{
HttpContext.GetOwinContext().Authentication.Challenge(
new AuthenticationProperties
{
RedirectUri = "/"
},
OpenIdConnectAuthenticationDefaults.AuthenticationType);
}
}
这几乎是进行组织认证的默认设置。这有效,我甚至可以从AAD配置文件中读出我的用户信息:
private string GetUserName()
{
var claimsPrincipal = ClaimsPrincipal.Current;
var firstName = claimsPrincipal.FindFirst(ClaimTypes.GivenName).Value;
var lastName = claimsPrincipal.FindFirst(ClaimTypes.Surname).Value;
return $"{firstName} {lastName}";
}
现在我尝试使用Microsoft Graph来表示头像图片。有一些官方MS样本可用here。但是所有这些都依赖于名为Microsoft.Identity.Client
的NuGet包,目前是预览版。另一件事是MS希望我在Application Registration Portal下注册我的应用程序,这对我来说没有任何意义,因为我已经有一个注册的应用程序。
我已经尝试从我的声明标识中检索我的不记名令牌,并在图中使用它,如下所示:
var ci = (System.Security.Claims.ClaimsIdentity)ClaimsPrincipal.Current.Identity;
var token = ((System.IdentityModel.Tokens.BootstrapContext)ci.BootstrapContext).Token;
var endpoint = "https://graph.microsoft.com/v1.0/me/photo/$value";
using (var client = new HttpClient())
{
using (var request = new HttpRequestMessage(HttpMethod.Get, endpoint))
{
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var response = await client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsStreamAsync();
}
}
}
return null;
但是这给了我401。
答案 0 :(得分:3)
您需要使用应用的客户端ID和密码获取带有ADAL的令牌。
您可以从NuGet获取ADAL:https://www.nuget.org/packages/Microsoft.IdentityModel.Clients.ActiveDirectory/
E.g:
string authority = "https://login.microsoftonline.com/your-tenant-id";
var authenticationContext = new AuthenticationContext(authority);
string clientId = "your-app-client-id";
string clientSecret = "yourappclientsecret";
var clientCredential = new ClientCredential(clientId, clientSecret);
string resource = "https://graph.microsoft.com";
AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(resource, clientCredential);
string accessToken = authenticationResult.AccessToken;
将 your-tenant-id 替换为您的Azure AD租户ID或域名(例如mytenant.onmicrosoft.com)。将 your-app-client-id 替换为在AAD中注册的应用的客户端ID /应用ID。将 yourappclientsecret 替换为在AAD中为应用程序创建的客户端密钥/密钥。
我在示例中对它们进行了硬编码,以便更容易理解。在生产中,您不应该将代码存储在代码中。