在【Xamarin+Prism小試牛刀:定制跨平臺Outlook郵箱應(yīng)用】里面提到了Microsoft 身份認(rèn)證,其實這也是一大塊需要注意的地方,特作為后續(xù)補(bǔ)充這些知識點(diǎn)。上章是使用了Microsoft Authentication Library (MSAL)類庫做認(rèn)證,其實最后使用的是Azure AD V2.0 的OAuth2.0認(rèn)證,而且支持所有用戶身份認(rèn)證:
個人用戶(@live.com、@outlook.com、@hotmail.com)
企業(yè)(工作或?qū)W校)用戶(@xxx.onmicrosoft.com)
以前如果需要支持Microsoft個人賬號和Azure Active Directory兩者是很困難的,必須實現(xiàn)兩套認(rèn)證邏輯,現(xiàn)在借助Azure AD V2.0可以一次性實現(xiàn)。
Azure AD V2.0 和 Azure AD區(qū)別統(tǒng)計如下:
Azure AD | Azure AD V2.0 | |
條件訪問設(shè)備策略 | 支持 | 目前不支持 |
兼容 OAuth 2.0 和 OpenID Connect | 不兼容 | 兼容 |
用戶權(quán)限 | 靜態(tài):應(yīng)用注冊期間已指定 | 動態(tài):應(yīng)用運(yùn)行時期間請求;包括增量許可 |
帳戶類型 | 工作或?qū)W校 | 工作或?qū)W校 個人 |
應(yīng)用程序 ID | 各個平臺單獨(dú)的應(yīng)用程序 ID | 多個平臺同一個應(yīng)用程序 ID |
注冊地點(diǎn) | Microsoft Azure 管理 | Microsoft 應(yīng)用程序注冊 |
認(rèn)證類庫 | ADAL:Active Directory 身份驗證 例如: AuthenticationContext.AcquireTokenAsync(resource,CLIENT_ID,new Uri(REDIRECT_URL), platformParameters); | MSAL:Microsoft身份驗證(預(yù)覽版) 例如: PublicClientApplication.AcquireTokenAsync(Scopes) |
溫馨提醒:
在[Microsoft 應(yīng)用程序注冊]注冊的應(yīng)用ID,ADAL一樣可以使用登錄,不過只限管理員和已經(jīng)授權(quán)給這個應(yīng)用的用戶.(如果用戶登錄不了,可以先使用MSAL類庫彈出授權(quán)頁面授權(quán),然后再使用ADAL就可以登錄了。)
Token
通過ADAL或者M(jìn)SAL類庫取得的JWT IDToken是可以解析的,解析之后的數(shù)據(jù)如下:
兩個類庫取得的RefreshToken都是存儲在應(yīng)用相關(guān)文件夾里面,具體地址如下:
UWP
private static void DefaultTokenCache_BeforeAccess(TokenCacheNotificationArgs args) { try
{
var localSettings = ApplicationData.Current.LocalSettings; localSettings.CreateContainer(LocalSettingsContainerName, ApplicationDataCreateDisposition.Always); byte[] state =LocalSettingsHelper.GetCacheValue(localSettings.Containers[LocalSettingsContainerName].Values); if (state != null) { DefaultShared.Deserialize(state); } } catch (Exception ex) { Logger.Information(null, "Failed to load cache: " + ex); //Ignore as the cache seems to be corrupt
} }
Android
try { ISharedPreferences preferences
= Application.Context.GetSharedPreferences(SharedPreferencesName, FileCreationMode.Private); string stateString = preferences.GetString(SharedPreferencesKey, null); if (stateString != null) { byte[] state =Convert.FromBase64String(stateString); args.TokenCache.Deserialize(state); } } catch (Exception ex) { PlatformPlugin.Logger.Warning(null, "Failed to load cache: " + ex); // Ignore as the cache seems to be corrupt
}
iOS
try { SecStatusCode res;
var rec = new SecRecord(SecKind.GenericPassword) { Generic = NSData.FromString(LocalSettingsContainerName), Accessible =SecAccessible.Always, Service = "MSAL.PCL.iOS Service", Account = "MSAL.PCL.iOS cache", Label = "MSAL.PCL.iOS Label", Comment = "MSAL.PCL.iOS Cache", Description = "Storage for cache"
};
var match = SecKeyChain.QueryAsRecord(rec, out res); if (res == SecStatusCode.Success && match != null && match.ValueData != null) { byte[] dataBytes = match.ValueData.ToArray(); if (dataBytes != null) { args.TokenCache.Deserialize(dataBytes); } } } catch (Exception ex) { PlatformPlugin.Logger.Warning(null, "Failed to load cache: " + ex); // Ignore as the cache seems to be corrupt
}
Token | 有效期 | 描述 |
ID Token(企業(yè)用戶) | 1小時 | |
ID Token(個人用戶) | 24小時 | |
Access Token | 1小時 | 可以通過Refresh Token獲取新的。 |
Refresh Token(企業(yè)用戶) | 14天 | 每次使用之后重新設(shè)置14天有效期,最大更新到90天。 |
Refresh Token(個人用戶) | 1年 |
備注:
之所以對這個稍微研究,其實最開始是有一個目的【就是使用這些類庫獲得的Token是否可以訪問所有企業(yè)的Office365?】。調(diào)查之后發(fā)現(xiàn)ADAL確實可以直接訪問Sharepoint Rest API,不過每個企業(yè)的Azure AD都需要注冊身份驗證應(yīng)用,從而有多個應(yīng)用ID,這樣程序請求的應(yīng)用ID都需單獨(dú)設(shè)置,這樣就變成了企業(yè)定制版(如果有懂的希望能給點(diǎn)建議?畢竟Azure AD上還有很多現(xiàn)成的應(yīng)用,這些不知道是怎么放上去的?)。對應(yīng)MSAL類庫得使用它自己開放出來的Sharepoint API才行,而且目前它的API還是Beta版很多東西都不完全。如果只想做企業(yè)內(nèi)部的應(yīng)用的話,ADAL類庫還是足夠的。
每天成就一小步,積累下來就是一大步。 轉(zhuǎn)發(fā)本文請注明出處,謝謝您的閱讀與分享!