ADAL AcquireToken Windows身份验证UWP

ADAL AcquireToken Windows身份验证UWP,uwp,windows-authentication,adfs,adal,Uwp,Windows Authentication,Adfs,Adal,我正在开发一个UWP应用程序,该应用程序需要针对本地ADFS 2016实例进行身份验证,但使用Windows集成身份验证 我用的是ADAL3.19.8。 应用程序正在加入域的Windows 10设备上运行。 该应用程序启用了企业身份验证、专用网络(客户端和服务器)和共享用户证书功能,如下所述: 我正在将UseComporateWork标志设置为true。 Windows集成身份验证在Internet选项中启用,我已将ADFS服务器添加到本地Intranet区域 以下是我尝试验证的方式: stri

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

我用的是ADAL3.19.8。 应用程序正在加入域的Windows 10设备上运行。 该应用程序启用了企业身份验证、专用网络(客户端和服务器)和共享用户证书功能,如下所述:

我正在将UseComporateWork标志设置为true。 Windows集成身份验证在Internet选项中启用,我已将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相同的用户名和密码凭据。显然,这并不理想,也不是应用程序用户希望看到的行为

使用Fiddler,我可以看到UWP应用程序调用

如果在WinForms应用程序中使用上述代码,我可以获得预期的SSO行为(尽管没有工作过载)。 使用Fiddler调用WinForms应用程序


我缺少什么?

如果
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));
  }
}

有关更多信息,请参阅。

我缺少的一点是,您需要从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中注册

这篇文章很有帮助:

这是相关章节:

特定于WinRT和UWP(公司网络)的平台参数的属性 WinRT(直到ADAL 3.x)和UWP平台具有以下属性UseCorporatenework是一个布尔值,如果该用户使用联合Azure AD租户中的帐户登录,则Win8.1和UWP应用程序可以从windows集成身份验证(以及用户使用操作系统登录的SSO)中获益。这利用了WAB(Web身份验证代理)

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

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

在windows 8.1应用商店中获取重定向URI 注意:对Win8.1和Windows Phone 8.1的支持在ADAL 4.x中停止。仍然支持Windows 10应用程序(UWP)

对于windows应用商店应用程序,您需要查找windows Phone应用程序的回调uri。最简单的方法是在初始化方法中添加一行(例如在主页面中),并在方法中的这一行上设置断点:

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

然后,运行应用程序,并在遇到断点时将redirectUri的值复制到一边。它应该看起来像ms-app://s-1-15-2-1352796503-54529114-405753024-3540103335-3203256200-511895534-1429095407/ 回到Azure门户中应用程序的ReplyURLs选项卡上,添加此值


希望这对其他正在与同样问题作斗争的人有用

在通过AcquireTokenAsync方法成功进行身份验证之前,以静默方式获取令牌将始终引发异常。问题是对AcquireTokenAsync的调用会显示一个请求凭据的对话框:我希望它改为使用集成Windows身份验证,即没有对话框。是的,如果您已成功使用
AcquireTokenAsync
方法进行身份验证,则下次可以调用
AcquireTokenSilentAsync
进行验证。它不会显示对话框,请确保下次启动时不会清除应用程序。注意,您需要取消选中“卸载”,然后重新安装Visual Studio的“我的软件包”选项。