ADAL AcquireToken Windows身份验证UWP

时间:2018-07-13 16:09:08

标签: uwp adfs adal iwa

我正在开发需要针对本地ADFS 2016实例进行身份验证的UWP应用,但使用Windows集成身份验证。

我正在使用ADAL 3.19.8。 该应用程序在加入域的Windows 10设备上运行。 该应用程序具有企业身份验证,专用网络(客户端和服务器)和共享用户证书功能,如下所示:https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/uwp-specificities

我将UseCorporateNetwork标志设置为true。 在Internet选项中启用了Windows集成身份验证,并且我已将ADFS服务器添加到“本地Intranet”区域。

这是我尝试进行身份验证的方式:

string authority = "https://xxxx/adfs/oauth2";
const bool useCorporateNetwork = true;
var authContext = new AuthenticationContext(authority, false);
var authResult = await authContext.AcquireTokenAsync(
        resourceURI, 
        clientID, 
        new Uri(clientReturnURI), 
        new PlatformParameters(PromptBehavior.Auto, useCorporateNetwork));

针对ADFS的身份验证成功,并且我获得了访问和ID令牌。但是,该应用程序始终显示ADFS登录屏幕。要继续,我输入与登录Windows相同的用户名和密码凭据。显然,这并不理想,也不是应用程序用户希望看到的行为。

使用提琴手,我看到UWP应用程序调用{​​{3}}。

如果使用上面的代码,但是在WinForms应用程序中,则可以获得我期望的SSO行为(尽管没有useCorporateNetwork重载)。 使用Fiddler,WinForms应用程序调用{​​{3}}

我想念什么?

2 个答案:

答案 0 :(得分:0)

如果ADAL.NET已为用户获取了Web API的令牌,它将与刷新令牌一起缓存。下次应用程序需要令牌时,它可以首先调用AcquireTokenSilentAsync来验证缓存中是否可接受令牌。

AuthenticationContext ac = new AuthenticationContext(authority);
AuthenticationResult result=null;
try
{
 result = await ac.AcquireTokenSilentAsync(resource, clientId);
}
catch (AdalException adalException)
{
 if (adalException.ErrorCode == AdalError.FailedToAcquireTokenSilently
     || adalException.ErrorCode == AdalError.InteractionRequired)
  {
   result = await ac.AcquireTokenAsync(resource, clientId, redirectUri,
                                       new PlatformParameters(PromptBehavior.Auto));
  }
}

有关更多信息,请参阅this

答案 1 :(得分:0)

我所缺少的一点是,您需要从WebAuthenticationBroker获取客户端重定向Uri,而不是将其设置为任意字符串:

Uri clientReturnURI = Windows.Security.Authentication.Web
    .WebAuthenticationBroker.GetCurrentApplicationCallbackUri();

这将返回URI,例如ms-app:// s-1-15-2-1352796503-54529114-405753024-3540103335-3203256200-511895534-1429095407 /,并且需要针对本机应用程序在ADFS中注册。

这篇文章很有帮助:https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/wiki/Acquiring-tokens-interactively---Public-client-application-flows

这是相关部分:

  

WinRT和UWP(企业网络)专用的PlatformParameter的属性

     

WinRT(直到ADAL 3.x)和UWP平台具有以下属性UseCorporateNetwork是一个布尔值,它使Win8.1和UWP应用程序能够从Windows集成身份验证中受益(因此,使用操作系统)(如果该用户使用联盟Azure AD租户中的帐户登录)。这利用了WAB(Web身份验证代理)。

     

重要提示:将此属性设置为true假定应用程序开发人员已在应用程序中启用Windows集成身份验证(WIA)。为此:

     

在您的UWP应用程序的Package.appxmanifest中的“功能”选项卡中,启用以下功能:   企业认证   专用网络(客户端和服务器)   默认情况下,共享用户证书WIA未启用,因为请求企业身份验证或共享用户证书功能的应用程序需要更高级别的验证才能被Windows商店接受,并且并非所有开发人员都希望执行更高级别的验证。   请注意,在启用条件访问的企业方案中,UWP平台(WAB)上的基础实现无法正常工作。症状是用户尝试使用Windows hello登录,并被建议选择一个证书,但是找不到该引脚的证书,或者用户选择了该证书,但从未提示输入该引脚。解决方法是使用替代方法(用户名/密码+电话身份验证),但是体验不好。将来,ADAL和MSAL将需要利用WAM,这将解决问题。

     

在Windows 8.1存储应用程序中获取重定向URI

     

注意:在ADAL 4.x中停止了对Win8.1和Windows Phone 8.1的支持。仍然支持Windows 10应用程序(UWP)

     

对于Windows Store应用程序,您将需要发现Windows Phone应用程序的回调uri。最简单的方法是在Initialization方法中添加一行(例如在MainPage中),然后在方法中的此行上设置断点:

     

var redirectURI = Windows.Security.Authentication.Web.WebAuthenticationBroker.GetCurrentApplicationCallbackUri();

     

然后,运行应用程序,并在命中断点时复制并保留redirectUri的值。它的外观应类似于ms-app:// s-1-15-2-1352796503-54529114-405753024-3540103335-3203256200-511895534-1429095407 /返回Azure门户中应用程序的ReplyURLs选项卡上,添加此值。

希望这对其他遇到相同问题的人有用!