zoukankan      html  css  js  c++  java
  • Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用(后续)

    在【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类库还是足够的。

  • 相关阅读:
    366. Find Leaves of Binary Tree输出层数相同的叶子节点
    716. Max Stack实现一个最大stack
    515. Find Largest Value in Each Tree Row查找一行中的最大值
    364. Nested List Weight Sum II 大小反向的括号加权求和
    156. Binary Tree Upside Down反转二叉树
    698. Partition to K Equal Sum Subsets 数组分成和相同的k组
    244. Shortest Word Distance II 实现数组中的最短距离单词
    187. Repeated DNA Sequences重复的DNA子串序列
    java之hibernate之基于主键的双向一对一关联映射
    java之hibernate之基于主键的单向一对一关联映射
  • 原文地址:https://www.cnblogs.com/lixiaobin/p/ADALMSAL.html
Copyright © 2011-2022 走看看