我正在尝试代表用户获取Azure AD令牌,以便我可以通过Azure AD应用程序(该应用程序连接到SharePoint Online API)访问某些资源。
我的问题是代表用户获取令牌。我在应用程序中添加了具有权限的Azure AD应用程序作为Auth方法(使用Visual Studio 2017自动添加)。有什么方法可以使用内置身份验证代表用户获取令牌? (因为它已经重定向用户(如果尚未登录),则该用户登录。)
我已经尝试过类似的操作,但是我认为此令牌是为应用程序而不是代表用户的(如果我尝试访问SharePoint,则给出401)。
string clientId = 'xxxxxxxx';
string clientSecret = 'xxxxxxxxx'
var credential = new ClientCredential(clientId, clientSecret);
AuthenticationResult result = await authContext.AcquireTokenAsync("https://MYSITE.onmicrosoft.com/APPID", credential);
答案 0 :(得分:1)
我正在尝试代表用户获取Azure AD令牌,以便我可以通过Azure AD应用程序(该应用程序连接到SharePoint Online API)访问某些资源。
如果要访问共享点,则需要在Azure AD中创建一个有权访问API的应用程序。并且不要忘记授予权限。
Microsoft Graph 使开发人员能够从多个Microsoft Cloud服务访问数据,包括:
- Azure AD(针对用户和组)
- Office 365
- SharePoint Online
- 在线交流
- OneDrive for Business
- OneNote
- 计划者
- Excel
- OneDrive消费者
- Outlook.com
另一件事是资源应该是https://graph.microsoft.com
而不是您的应用程序。
以下是演示代码
private static async Task<string> GetAppTokenAsync(string tenantId, string clientId, string username,string password)
{
var graphResource = "https://graph.microsoft.com";
string aadInstance = "https://login.microsoftonline.com/" + tenantId + "/oauth2/token";
//Instantiate an AuthenticationContext for my directory (see authString above).
AuthenticationContext authenticationContext = new AuthenticationContext(aadInstance, false);
// Create a ClientCredential that will be used for authentication.
//This is where the Client ID and Key / Secret from the Azure Management Portal is used.
UserPasswordCredential credential = new UserPasswordCredential(username, password); //username is email format
// Acquire an access token from Azure AD to access the Azure Microsoft Graph(the resource)
// using the Client ID and Key / Secret as credentials.
AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(graphResource, clientId, credential);
// Return the access token.
return authenticationResult.AccessToken;
}
答案 1 :(得分:1)
有什么方法可以使用内置身份验证代表用户获取令牌? (因为它已经重定向用户(如果尚未登录),则该用户登录。)
是的,在对用户进行身份验证之后,您应该获取访问令牌以访问SharePoint Online API / Microsoft Graph api。
您可以使用OID 2.0协议使用OpenID Connect中间件和Active Directory身份验证库(ADAL.NET)为登录用户获取JWT承载令牌:
// Because we signed-in already in the WebApp, the userObjectId is know
string userObjectID = (User.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier"))?.Value;
// Using ADAL.Net, get a bearer token to access the TodoListService
AuthenticationContext authContext = new AuthenticationContext(AzureAdOptions.Settings.Authority, new NaiveSessionCache(userObjectID, HttpContext.Session));
ClientCredential credential = new ClientCredential(AzureAdOptions.Settings.ClientId, AzureAdOptions.Settings.ClientSecret);
result = await authContext.AcquireTokenSilentAsync(AzureAdOptions.Settings.TodoListResourceId, credential, new UserIdentifier(userObjectID, UserIdentifierType.UniqueId));
您可以参考代码示例:Calling a web API in an ASP.NET Core web application using Azure AD。请将该资源替换为SharePoint Online API / Microsoft Graph api以满足您的要求。
我已经尝试过类似的操作,但是我认为此令牌是为应用程序而不是代表用户的(如果我尝试访问SharePoint,则给出401)。
是的,您的代码使用Client credentials grant flow来进行身份验证,该代码使用应用程序自己的凭据而不是冒充用户,以便在调用另一个Web服务时进行身份验证。