【发布时间】:2016-01-17 12:00:57
【问题描述】:
我正在尝试从当前上下文中的所有项目中查找单个项目,但我似乎不断收到此错误消息:
请求失败。远程服务器返回错误:(401) Unauthorized.
首先,我设置好一切以访问交换服务:
var signInUserId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
var userObjectId = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
AuthenticationResult authenticationResult = null;
AuthenticationContext authenticationContext = new AuthenticationContext(
SettingsHelper.Authority, new model.ADALTokenCache(signInUserId));
authenticationResult = authenticationContext.AcquireToken(
SettingsHelper.ServerName,
new ClientCredential(SettingsHelper.ClientId, SettingsHelper.ClientSecret));
ExchangeService exchange = new ExchangeService(ExchangeVersion.Exchange2013);
exchange.Url = new Uri(SettingsHelper.ServerName + "ews/exchange.asmx");
exchange.TraceEnabled = true;
exchange.TraceFlags = TraceFlags.All;
exchange.Credentials = new OAuthCredentials(authenticationResult.AccessToken);
然后我定义我想要接收的项目(通过 ID):
ItemView view = new ItemView(5);
view.PropertySet = new PropertySet(BasePropertySet.IdOnly);
var tempId = id.Replace('-', '/').Replace('_', '+');
SearchFilter.IsEqualTo searchid = new SearchFilter.IsEqualTo(ItemSchema.Id, tempId);
最后但并非最不重要的一点是,我尝试在我的项目中搜索此项目:
FindItemsResults<Microsoft.Exchange.WebServices.Data.Item> results = exchange.FindItems(WellKnownFolderName.Inbox, searchid, view);
这就是我的错误发生的地方。我已经尝试了各种其他方法来做到这一点,但无论我做什么,我都会得到未经授权的。
有人可以指导我以正确的方式解决这个问题吗?
编辑
我确实从以下位置收到访问令牌:
authenticationResult = authenticationContext.AcquireToken(
SettingsHelper.ServerName,
new ClientCredential(SettingsHelper.ClientId, SettingsHelper.ClientSecret));
我可以通过调试代码看到。
虽然没有刷新令牌,不知道这是否有话要说?
编辑
我只是设法调试到exchange.ResponseHeaders,在那里我看到了这个:
访问令牌是使用一种身份验证方法获取的,该方法是 太弱,无法访问此应用程序。提交身份验证 强度为 1,要求为 2
我decoded the JWT,因为这是我的结果:
{
typ: "JWT",
alg: "RS256",
x5t: "MnC_VZcATfM5pOYiJHMba9goEKY",
kid: "MnC_VZcATfM5pOYiJHMba9goEKY"
}.
{
aud: "https://outlook.office365.com/",
iss: "https://sts.windows.net/d35f5b06-f051-458d-92cc-2b8096b4b78b/",
iat: 1445416753,
nbf: 1445416753,
exp: 1445420653,
ver: "1.0",
tid: "d35f5b06-f051-458d-92cc-2b8096b4b78b",
oid: "c5da9088-987d-463f-a730-2706f23f3cc6",
sub: "c5da9088-987d-463f-a730-2706f23f3cc6",
idp: "https://sts.windows.net/d35f5b06-f051-458d-92cc-2b8096b4b78b/",
appid: "70af108f-5c8c-4ee4-a40f-ab0b6f5922e0",
appidacr: "1"
}.
[signature]
从这里到哪里去?
【问题讨论】:
-
我建议硬设置“exchange.Credentials”,直到您完成身份验证为止......因为它似乎是您的问题......
-
exchange.Credentials = new WebCredentials(authEmailAddress, authEmailPassword, "DOMAINIFYOUHAVEONE");
-
@Seabizkit 这行得通。这就是我开始时所做的,效果很好,但我想使用 OAuth
-
@Detilium 参考此link Np 并使用
aud检查剩余项目 -
@Webruster 我不确定你的意思?
aud是https://outlook.office365.com/哪个是正确的?
标签: c# asp.net-mvc office365 exchangewebservices