我目前正在开发Outlook应用程序。我有一个Javascript加载项项目和一个MVC Web API项目。我尝试将加载项中的令牌发送到API,并从所述令牌获取新令牌以访问Sharepoint和Exchange。
目前我收到以下错误:
AADSTS70002:验证凭据时出错。 AADSTS50013:断言受众群体声明与所需值不符。
以下是我从Javascript加载项获取令牌的方法:
//GET NEW ACCESS TOKEN
var _mailBox = Office.context.mailbox;
_mailbox.getUserIdentityTokenAsync(function (result) {
var token = result.value;
var item = _mailbox.item;
//The initial ajax to the Web API
$.ajax({
type: 'POST',
url: "https://192.168.0.150:30303/api/api/uploadfile";
data: JSON.stringify({
'MailId': item.itemId,
'SpListguid': guid //GUID of the Sharepoint list we wish to upload this email to
}),
headers: {
'Authorization': 'Bearer ' + token,
},
contentType: 'application/json'
}).done(function () {
console.log("Successfully hit the service");
}).error(function (err) {
console.log("Something went wrong! Oh boi!");
console.log(err);
})
})
以下是我在MVC Web API中处理令牌的方法:
[EnableCors(origins: "*", headers"Origin, Content-Type, Authorization, Accept", methods: "GET, POST, OPTIONS")]
public class APIController : ApiController
{
[HttpPost]
public IHttpActionTResult UploadFile(){
using(ClientContext clientcontext = SharePointHelper.GeClientContextWithAccessToken(this.ControllerContext))
{
//Do something once done
}
}
}
此处使用SharePointHelper
方法的课程GetClientContextWithAccessToken(HttpControllerContext)
:
public class SharepointHelper
{
public static Clientcontext GetclientcontextwithAccessToken(HttpControllercontext controlerContext)
{
string tenantId = {my-tenant-id};
string authority = string.format("https://login.windows.net/{0}", tenantId);
string resource = {the-app-id-uri-from-my-addin-in-azure}; //example could be "https://sharepointcommunity.com/outlookaddin"
AuthenticationContext authContext = new AuthenticationContext(authority)
var authResult = AcquireUserAssertionAccessToken(controllerContext, authContext, resource)
}
private static AuthenticationResult AcquireUserAssertionAccessToken(HttpControllercontext controllercontext, AuthenticationCotnext authContext, string resource)
{
var rawToken = controllerContext.Request.Headers.GetValues("Authorization").First();
string userAccessToken = token.Substring(token.LastIndexOf(' ')).Trim(); //To remove the "Bearer"
var cc = new ClientCredentials({my-client-id}, {my-client-secret});
var ua = new UserAssertion(userAccessToken);
var result = authContext.AcquireToken(resource, cc, ua);
}
}
最后一行是发生错误的地方(var result = ...
)。
我不确定是否会因为JavaScript加载项中的身份令牌错误或其他错误而发生这种情况。
注意: AAD中的JavaScript加载项具有AAD中MVC Web API的权限。 MCV Web API具有Exchange和SharePoint的权限。
答案 0 :(得分:2)
前提是我不知道办公室人员在他们的包装方法中做了什么。
您应该在服务器端请求的资源不是您的 插件,但共享点或交换。让API请求令牌 对于前端没有任何我能想到的目的。如果 你解决了这个问题,但仍然无效。
尝试使用
UserAssertion
醇>
string userName = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn) != null ? ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn).Value : ClaimsPrincipal.Current.FindFirst(ClaimTypes.Email).Value;
UserAssertion userAssertion = new UserAssertion(userAccessToken, "urn:ietf:params:oauth:grant-type:jwt-bearer", userName);