在【Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用】里面提到了Microsoft 身份认证,其实这也是一大块需要注意的地方,特作为后续补充这些知识点。上章是使用了Microsoft Authentication Library (MSAL)类库做认证,其实最后使用的是Azure AD V2.0 的OAuth2.0认证,而且支持所有用户身份认证:

  • 个人用户(@live.com、@outlook.com、@hotmail.com)

  • 企业(工作或学校)用户(@xxx.onmicrosoft.com)

以前如果需要支持Microsoft个人账号和Azure Active Directory两者是很困难的,必须实现两套认证逻辑,现在借助Azure AD V2.0可以一次性实现。

Azure AD V2.0 和 Azure AD区别统计如下:


Azure ADAzure AD V2.0
条件访问设备策略支持目前不支持
兼容 OAuth 2.0 和 OpenID Connect不兼容兼容
用户权限静态:应用注册期间已指定动态:应用运行时期间请求;包括增量许可
帐户类型

工作或学校

工作或学校

个人

应用程序 ID各个平台单独的应用程序 ID多个平台同一个应用程序 ID
注册地点Microsoft Azure 管理Microsoft 应用程序注册
认证类库ADAL:Active Directory 身份验证
例如:

AuthenticationContext.AcquireTokenAsync(resource,CLIENT_ID,new Uri(REDIRECT_URL),              platformParameters);

MSAL:Microsoft身份验证(预览版)
例如:
PublicClientApplication.AcquireTokenAsync(Scopes)

 

温馨提醒:

在[Microsoft 应用程序注册]注册的应用ID,ADAL一样可以使用登录,不过只限管理员和已经授权给这个应用的用户.(如果用户登录不了,可以先使用MSAL类库弹出授权页面授权,然后再使用ADAL就可以登录了。

iOS培训,Swift培训,苹果开发培训,移动开发培训

 

Token

通过ADAL或者MSAL类库取得的JWT IDToken是可以解析的,解析之后的数据如下:

iOS培训,Swift培训,苹果开发培训,移动开发培训

两个类库取得的RefreshToken都是存储在应用相关文件夹里面,具体地址如下:

UWP

iOS培训,Swift培训,苹果开发培训,移动开发培训

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培训,Swift培训,苹果开发培训,移动开发培训

Android

iOS培训,Swift培训,苹果开发培训,移动开发培训

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培训,Swift培训,苹果开发培训,移动开发培训

iOS

iOS培训,Swift培训,苹果开发培训,移动开发培训

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培训,Swift培训,苹果开发培训,移动开发培训

 

Token有效期描述
ID Token(企业用户)1小时
ID Token(个人用户)24小时
Access Token1小时可以通过Refresh Token获取新的。
Refresh Token(企业用户)14天每次使用之后重新设置14天有效期,最大更新到90天。
Refresh Token(个人用户)1年

 

备注:

之所以对这个稍微研究,其实最开始是有一个目的【就是使用这些类库获得的Token是否可以访问所有企业的Office365?】。调查之后发现ADAL确实可以直接访问Sharepoint Rest API,不过每个企业的Azure AD都需要注册身份验证应用,从而有多个应用ID,这样程序请求的应用ID都需单独设置,这样就变成了企业定制版(如果有懂的希望能给点建议?毕竟Azure AD上还有很多现成的应用,这些不知道是怎么放上去的?)。对应MSAL类库得使用它自己开放出来的Sharepoint API才行,而且目前它的API还是Beta版很多东西都不完全。如果只想做企业内部的应用的话,ADAL类库还是足够的。

每天成就一小步,积累下来就是一大步。 转发本文请注明出处,谢谢您的阅读与分享!


延伸阅读

告别“老顽固”-Java培训,做最负责任的教育,学习改变命运,软件学习,再就业,大学生如何就业,帮大学生找到好工作,lphotoshop培训,电脑培训,电脑维修培训,移动软件开发培训,网站设计培训,网站建设培训告别“老顽固”