使用AAD App访问Microsoft Graph

时间:2017-07-14 12:04:07

标签: c# asp.net .net azure azure-active-directory

我从问题开始。如何使用Microsoft Graph使用在Azure AD内部执行的应用程序注册从AAD读取数据?现在细节......

我在Azure Active Directory中创建了一个应用注册,并允许在那里访问Microsoft Graph:

AAD portal with required permissions

确切地说,该应用具有以下权限:

  • 申请权限
    • 阅读所有用户'相关人员列出并搜索目录
    • 阅读所有用户'完整档案
  • 委托权限 (无)

我在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。

1 个答案:

答案 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中为应用程序创建的客户端密钥/密钥。

我在示例中对它们进行了硬编码,以便更容易理解。在生产中,您不应该将代码存储在代码中。