在【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 ADAzure 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就可以登錄了。

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

 

Token

通過ADAL或者M(jìn)SAL類庫取得的JWT IDToken是可以解析的,解析之后的數(shù)據(jù)如下:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

兩個類庫取得的RefreshToken都是存儲在應(yīng)用相關(guān)文件夾里面,具體地址如下:

UWP

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

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

            }

        }

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

Android

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

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培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

iOS

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

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

            }

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

 

Token有效期描述
ID Token(企業(yè)用戶)1小時
ID Token(個人用戶)24小時
Access Token1小時可以通過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ā)本文請注明出處,謝謝您的閱讀與分享!