0

我想制作一个与 Web API 应用程序对话并使用 ADFS 3.0(在 Windows 2012 R2 上)进行身份验证的 MVC Web 应用程序。

我设法使 MVC Web 应用程序使用 ADFS 进行身份验证。并按照 Vittorio Bertocci 的这篇文章中所示配置了所有内容

http://www.cloudidentity.com/blog/2013/10/25/securing-a-web-api-with-adfs-on-ws2012-r2-got-even-easier/

现在我使用来自 nuget 的 AAL 的最新预发布版本

现在,在通过 Web MVC 应用程序使用 ADFS 进行身份验证后,我尝试调用 webapi

public async Task<String> CallSecuredAPI()
        {
            string authority = "https://fs.domain.com/adfs";
            string resourceURI = "https://{hostheader}/SecuredAPI";
            string clientID = "ExternalWebSite1";
            string clientReturnURI = "https://{hostheader}/ExternalSite";

            AuthenticationContext ac = new AuthenticationContext(authority, false);
            AuthenticationResult ar = ac.AcquireToken(resourceURI, clientID, new   Uri(clientReturnURI));

            string authHeader = ar.CreateAuthorizationHeader();
            var client = new HttpClient();
            HttpRequestMessage request =
                new HttpRequestMessage(HttpMethod.Get, "https://hostheader/SecuredAPI/api/Claims");
            request.Headers.TryAddWithoutValidation("Authorization", authHeader);
            HttpResponseMessage response = await client.SendAsync(request);
            string responseString = await response.Content.ReadAsStringAsync();
            return responseString;
        }

但我收到此错误,我认为客户端不是基于 UI 的客户端或 WPF、Windows 应用程序。有人可以让我知道我是否做错了什么。

![尝试使用 AAL 获取授权码时出错][1]

“/ExternalSite”应用程序中的服务器错误。

当应用程序未在 UserInteractive 模式下运行时显示模式对话框或表单不是有效操作。指定 ServiceNotification 或 DefaultDesktopOnly 样式以显示来自服务应用程序的通知。

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.InvalidOperationException:当应用程序未在 UserInteractive 模式下运行时显示模式对话框或表单不是有效操作。指定 ServiceNotification 或 DefaultDesktopOnly 样式以显示来自服务应用程序的通知。

Source Error: 


Line 43: 
Line 44:             AuthenticationContext ac = new AuthenticationContext(authority, false);
Line 45:             AuthenticationResult ar = ac.AcquireToken(resourceURI, clientID, new Uri(clientReturnURI));
Line 46:             
Line 47:             string authHeader = ar.CreateAuthorizationHeader();

Source File: c:\Users\balakrishna.takkalla\Documents\Visual Studio 2013\Projects\ExternalSite\ExternalSite\Controllers\HomeController.cs    Line: 45 

Stack Trace: 


[InvalidOperationException: Showing a modal dialog box or form when the application is not running in UserInteractive mode is not a valid operation. Specify the ServiceNotification or DefaultDesktopOnly style to display a notification from a service application.]
   System.Windows.Forms.Form.ShowDialog(IWin32Window owner) +5701502
   Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.WindowsFormsWebAuthenticationDialog.ShowBrowser() +18
   Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.WindowsFormsWebAuthenticationDialog.OnAuthenticate() +23
   Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.WindowsFormsWebAuthenticationDialogBase.AuthenticateAAD(Uri requestUri, Uri callbackUri) +284
   Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.InteractiveWebUI.OnAuthenticate() +103
   Microsoft.IdentityModel.Clients.ActiveDirectory.OAuth2Request.SendAuthorizeRequest(Authenticator authenticator, String resource, Uri redirectUri, String clientId, String userId, PromptBehavior promptBehavior, String extraQueryParameters, IWebUI webUi, CallState callState) +363
   Microsoft.IdentityModel.Clients.ActiveDirectory.<>c__DisplayClass9b.<AcquireAuthorization>b__9a() +111
   System.Threading.Tasks.Task.Execute() +110
4

1 回答 1

1

如果我理解正确:您想从 MVC 应用程序的代码隐藏中访问 Web API。今天使用 Azure Active Directory 可以实现该拓扑,您可以在示例https://github.com/AzureADSamples/WebApp-WebAPI-OpenIDConnect-DotNet中看到它的实际效果(我正在将其更新到最新的 ADAL 刷新,您可以查看 RCUpdate 分支以查看正在进行的工作)。

但是,今天从 ADFS WS2012 R2 无法实现该拓扑。原因是 MVC 应用程序(和任何其他网站)是机密客户端,OAuth2 处理它的方式与公共客户端不同(您用作起点的 WPF 应用程序是公共客户端)。在您的目标场景中,要使用 ADAL 从机密客户端获取令牌,您将使用 ADAL 的方法 AcquireTokenByAuthorizationCode(请参阅我提到的示例)。但是 ADFS WS2012 R2 无法处理该方法。今天,ADFS WS2012 R2 中的 OAuth2 支持仅限于公共客户端。

抱歉带来坏消息!作为一种缓解措施,您可以考虑将您的 ADFS 与 AAD 租户联合:此时您将能够做您想做的事情,以 ADFS 用户身份进行身份验证,但从 AAD 获取令牌(它确实支持必要的 OAuth2 授权)。HTH V。

于 2014-07-12T08:08:14.517 回答