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

  • 相关阅读:
    敏捷之旅--携程境外租车团队敏捷实践
    (一)LoadRunner安装
    性能测试,相关术语解析
    Newtonsoft.Json
    主流浏览器基于哪些内核?
    火狐浏览器与谷歌浏览器区别在哪里?
    带宽计算-大B与小b的区别
    loadrunner11录制不成功解决方法
    代码中的事务约束
    IOC框架Ninject实践总结
  • 原文地址:https://www.cnblogs.com/lixiaobin/p/ADALMSAL.html
Copyright © 2011-2022 走看看