如何使用Web应用程序/ WebAPI验证Azure AD中的用户凭据

时间:2016-02-17 16:22:05

标签: c# azure asp.net-web-api credentials azure-active-directory

我有一个网络应用程序。在主页中,用户将输入凭据,系统应根据Azure AD进行验证并继续进行。

当我使用本机应用程序并使用UserCredentials时,它会验证用户,但如果我对WebAPI使用相同的方法,则会抛出异常

  

请求正文必须包含以下参数:' client_secret   或者client_assertion'

当我使用clientCredentials使用WebAPI时,它会生成accessToken,而不会验证用户凭据。我还尝试在随后的调用中将凭据作为httpclient标头的一部分传递,尽管凭据错误,它仍在工作。

string AzureADSTSURL = "https://login.windows.net/{0}/oauth2/token?api-version=1.0";
string GraphPrincipalId = "https://graph.windows.net";

string userid = "userid";
string password = "pass";

string tenantId = "axxx";   //  webapi
string clientId = "bxxx";
string clientSecret = "cxxx";
string authString = String.Format(AzureADSTSURL, tenantId);

var context = new AuthenticationContext(authString);

UserCredential userCredentials = new UserCredential(userid, password);
AuthenticationResult authenticationResult = context.AcquireToken(GraphPrincipalId.ToString(), clientId, userCredentials); // this works only if the clientId corresponds to a native app

ClientCredential clientCredential = new ClientCredential(clientId, clientSecret);
AuthenticationResult result = context.AcquireToken(GraphPrincipalId, clientCredential);


HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(result.AccessToken, Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(userid + ':' + password)));

httpClient.GetAsync("http://localhost:11455/Login.aspx");

有没有办法在不使用原生应用的情况下验证凭据?我相信Graph API不是一个正确的选择。

3 个答案:

答案 0 :(得分:4)

我试图做同样的事情,并遇到了同样的错误:

  

请求正文必须包含以下参数:'client_secret或client_assertion'

我把头撞了一会儿,然后在twitter上点击了AzureSupport。

如果您将Azure AD应用设置为Native Client Application,则仅支持此类型的身份验证。如果将其设置为Web Application,则会出现该错误,因为在Azure AD中访问Web应用程序的唯一方法是通过客户端ID +密码。

您可以在单个AD上放置多个应用,因此您只需将第二个应用设置为本机客户端,即可对该目录中的相同用户进行身份验证。

答案 1 :(得分:1)

您当然可以使用WebAPI。以下是设置方法:

如果您使用支持ASP.NET MVC的Azure Web Apps,则可以使用Azure Active Directory身份验证机制。这是一篇博客文章,描述了如何设置它:https://azure.microsoft.com/en-us/documentation/articles/app-service-mobile-how-to-configure-active-directory-authentication/

完成后,将为您的应用启用auth,您可以在门户中配置AAD应用。有关详细信息,请参阅此博客文章:http://blogs.technet.com/b/ad/archive/2014/12/18/azure-active-directory-now-with-group-claims-and-application-roles.aspx

以下是一个示例,说明如何从网络应用中阅读AAD组声明:https://github.com/Azure-Samples/active-directory-dotnet-webapp-groupclaims

获得令牌后,您可以调用Web API,此示例显示:https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-openidconnect

这里有一个很好的AAD示例列表:https://azure.microsoft.com/en-us/documentation/articles/active-directory-authentication-scenarios/

答案 2 :(得分:1)

简答:否

我认为this article是关于原因的权威答案。

  

没有网站/保密客户
  这不是ADAL限制,而是AAD设置。您只能使用来自本机客户端的那些流。机密客户端(如网站)无法使用直接用户凭据。

     

直接使用用户名和密码是Faustian协议的一部分 - 你为其直接性付出的代价是它所带来的许多限制以及它对依赖任何解决方案施加的灵活性降低在它上面。