云中客

梦想有多大,就能走多远

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

在【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可以一次性实现。

Microsoft Graph 应用程序堆栈将身份验证显示为应用和各种 Microsoft Graph 资源之间的一个层。

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

  Azure AD Azure 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就可以登录了。

image

 

Token

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

image

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

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(企业用户) 1小时  
ID Token(个人用户) 24小时  
Access Token 1小时 可以通过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类库还是足够的。

posted on 2016-12-11 20:23  走遍江湖  阅读(1565)  评论(0编辑  收藏  举报