Azure AD Graph API和WsFederation身份验证

本文关键字:WsFederation 身份验证 API AD Graph Azure | 更新日期: 2023-09-27 17:56:47

我正在尝试在Azure上托管的MVC Web应用程序中实现Azure AD Graph API。Azure AD设置正确,因为在去年年底/今年的某个时候更新之前,我去年能够在以前的版本中使用Graph API。

我遵循这里的指示https://github.com/AzureADSamples/WebApp-GraphAPI-DotNet并使用更新后的代码。这两个项目的区别在于我使用的是WsFed而不是OpenID,所以有些部分是不同的,即Startup。以下是这个示例项目中的相关代码(见此处(:

Notifications = new OpenIdConnectAuthenticationNotifications()
{                      
    AuthorizationCodeReceived = (context) =>
    {
        var code = context.Code;
        ClientCredential credential = new ClientCredential(clientId, appKey);
        string userObjectID = context.AuthenticationTicket.Identity.FindFirst(
                "http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
        AuthenticationContext authContext = new AuthenticationContext(Authority, new NaiveSessionCache(userObjectID));
        AuthenticationResult result = authContext.AcquireTokenByAuthorizationCode(
            code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential, graphResourceId);
        AuthenticationHelper.token = result.AccessToken;
        return Task.FromResult(0);
    }
}

然而,由于我的网站设置为必须通过WS-Fed登录才能访问网站上的任何内容,我尝试在Startup中获得令牌。Auth.cs.,这样我以后就可以简单地使用AcquireTokenSilent了。我在这里使用项目https://github.com/AzureADSamples/WebApp-WSFederation-DotNet以设置WS-Fed。

启动中的问题。Auth.cs是我没有权限访问AuthorizationCodeReceived选项,只有SecurityTokenReceived和SecurityTokenValidated。这两个都没有为访问代码或任何我稍后在应用程序中可以用来查询Graph API的内容提供一个好的选项。我该怎么做?如有任何指导,我们将不胜感激。

Azure AD Graph API和WsFederation身份验证

不幸的是,WS-Federation协议没有任何客户端和访问令牌的概念——唯一交易的令牌是发送给您进行web登录的令牌,并且没有生成授权代码。如果您需要调用Graph API,我强烈建议您切换到OpenId Connect(它确实使用您上面报告的逻辑来处理访问令牌获取(。如果您绝对无法从ws-feed切换,则需要手动执行OAuth2流。在实践中,这意味着从https://github.com/AzureADSamples/WebApp-WebAPI-OAuth2-AppIdentity-DotNet或https://github.com/AzureADSamples/WebApp-WebAPI-OAuth2-UserIdentity-DotNet然后把它贴在你的应用程序上。这不是一项非常简单的任务,这就是为什么我坚持我的建议,利用OpenId Connect提供的集成流。HTHV.

我使用以下方法获得了一个Microsoft Graph访问令牌:使用以下参数对应用程序的oauth2/令牌端点https://login.microsoftonline.com/{tenantId}/oauth2/token执行服务器端POST:

grant_type=client_credentials
&client_id=<clientId>
&client_secret=<clientSecret>
&resource=https://graph.microsoft.com

在上文中,<clientSecret>是通过Azure管理门户生成的有效应用程序密钥。

方法如下所述:https://graph.microsoft.io/en-us/docs/authorization/app_only