none
对服务管理请求进行身份验证报错 RRS feed

  • 问题

  • 我根据微软提供的官方文档(https://msdn.microsoft.com/zh-cn/library/azure/ee460782.aspx)进行身份验证操作,添加应用程序类型的时候,只有添加本机客户端应用程序才可以获取到Token,并成功完成身份验证。而使用Web应用程序/Web API,会报一个错,错误信息:AADSTS90014: The request body must contain the following parameter: 'client_secret or client_assertion'.

    2015年11月4日 2:19

答案

  • Hi,

    很高兴你解决了问题并成功的获取了相应内容。据我所知,本地客户端程序和Web应用程序这两种方式获取的token确实是不一样的,所以我们在往AD里添加程序时一定要选择正确的程序类型,如果是本地客户端程序,那么我们勾选“本地客户端”,如果是web应用程序或Web API,那么我们勾选“Web 应用程序和/或 Web API”,你可以阅读这篇文章:http://www.windowsazure.cn/documentation/articles/active-directory-authentication-scenarios/了解更多详细信息。

    Best Regards,

    Jambor


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.



    2015年11月10日 7:17
    版主
  • 应用程序ID URI的格式是:https://<your_tenant_name>/WebAppGraphAPI, <your_tenant_name>就是你在上述图片中的jahwa.partner.onmschina.cn.

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 Rampb 2015年11月18日 3:55
    2015年11月18日 1:18
    版主
  • 不是的,我们可以在VS里面找到这个值:

    如果你将程序发布到Cloud Service,你需要修改Sign-on URL和Reply URL,我将我之前给你的demo发布到Cloud Service理,这个是地址:http://test1323.chinacloudapp.cn/Users,以这个为例,登录URL就要改成:https://test1323.chinacloudapp.cn/, Reply URL就要改成:http://test1323.chinacloudapp.cn/(web.config和Azure门户都要修改)。你可以按我之前给你的测试账号去登录测试下。Note:不要忘记URL最后的“/”符号。 

    建议你将这个帖子有用的回复标记成答案,如果有任何新问题,我们可以在新的帖子中继续探讨,非常感谢!


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.




    2015年11月18日 2:26
    版主

全部回复

  • 你好,

    从错误代码上来看,是说发送的request少了parameter。我在想是不是你在调请求之前没有加certificate?下面的链接也是这个原因报了类似的错误,请尝试一下它的代码看看能不能修复这个问题。 https://social.msdn.microsoft.com/Forums/azure/en-US/3ca6f39e-2558-4717-900a-8b1fbf279886/acs90014-the-request-body-must-contain-the-following-parameter-clientsecret-or-clientassertion?forum=WindowsAzureAD

    MSDN 提供了众多的Azure AD方面的sample,请看一下链接,https://msdn.microsoft.com/en-us/library/azure/dn646737#BKMK_AppToAPI

    如果以上都不能解决你的问题,请上传一个示例代码到云空间,然后共享一个链接给我,谢谢。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年11月4日 8:16
  • Hi,

    是这样的,异常并不是在发送请求的过程中报出来的,而是我获取Token值的时候报错,使用本地客户端应用程序成功获取到了Token值,但是使用Web 应用程序/Web API获取Token的时候报错。

    Regrads

    2015年11月4日 9:16
  • 你好,

    不确定是否是终结点地址没有配对,用的是OAuth 2.0的终结点地址吗?我的第一个回复里面的sample用起来没有问题,你看过了吗?

    能请你上传一个简单的重现问题的示例吗?这样猜的话也不知道具体问题在哪。 请上传一个示例代码到任意云空间,然后共享一个链接给我,谢谢。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年11月5日 2:17
  • Hi,

    不是我不上传示例,而是我就是直接把官网的示例代码贴过来用的,只不过把tenantId,clientId,redirectUri替换为我自己的,代码如下:

    private static string GetAuthorizationHeader()
    {
      AuthenticationResult result = null;
      
      var context = new AuthenticationContext("https://login.windows.net/{tenantId}");
    
      var thread = new Thread(() =>
      {
        result = context.AcquireToken(
          "https://management.core.windows.net/",
          "{clientId}",
          new Uri("{redirectUri}"));
      });
    
      thread.SetApartmentState(ApartmentState.STA);
      thread.Name = "AquireTokenThread";
      thread.Start();
      thread.Join();
                
      if (result == null)
      {
        throw new InvalidOperationException("Failed to obtain the JWT token");
      }
    
      string token = result.AccessToken;
      return token;
    }

    tenantId都是一样的,两种应用程序的clientId,redirectUri不一样,使用本地客户端应用程序成功获取到了Token值,而使用Web 应用程序/Web API获取Token的时候报错。

    情况就是这样,是在官网提供的代码上报错的,不是我自己写的代码报错。不知道这样描述,你是否明白我的意思了。

    Regrads


    2015年11月6日 3:39
  • 你好,

    不好意思是我疏忽了。如果是中国区的AD的话,要在代码里面把终结点改成中国区的地址。请去portal里面查看终结点的地址,就在AD部分。详见下图。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2015年11月6日 7:02
  • Hi,

    不好意思,应该是我疏忽,其实你的说的那个我已经改了的,不然本地应用程序也不可能获取到Token值的,代码如下:

    private string GetAuthorizationHeader()
    {
    	AuthenticationResult result = null;
    	var context = new AuthenticationContext("https://login.chinacloudapi.cn/{tenantId}");
    	var thread = new Thread(() =>
    	{
    		result = context.AcquireToken("https://management.core.chinacloudapi.cn/", "{clientId}", new Uri("{redirectUri}"));
    	});
    
    	thread.SetApartmentState(ApartmentState.STA);
    	thread.Name = "AquireTokenThread";
    	thread.Start();
    	thread.Join();
    
    	if (result == null)
    	{
    		throw new InvalidOperationException("Failed to obtain the JWT token");
    	}
    
    	string token = result.AccessToken;
    	return token;
    }

    2015年11月6日 9:33
  • 你好,

    终于找到问题所在了。其实错误信息已经给出明确含义了,就是客户端需要给出clientID和clientSecret。

    我用下面的代码测试通过了。

      AuthenticationResult result = null;
                try
                {
                    ClientCredential cc = new ClientCredential("clientID", "clientSecret");
                    result = authContext.AcquireToken(graphResourceId, cc);
                }
                catch (AdalException ex)
                {
                    if (ex.ErrorCode != "user_interaction_required")
                    {
                        // An unexpected error occurred.
                        MessageBox.Show(ex.Message);
                    }
    
                    // If user interaction is required, proceed to main page without singing the user in.
                    return;
                }

    到portal平台上面去找ID和Secret

    另外,留个记号给后来的小伙伴们,世纪互联上下载的示例里面的终结点需要改成中国区的。

    https://login.chinacloudapi.cn/{0}https://graph.chinacloudapi.cn


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.




    2015年11月9日 3:18
  • Hi,

    根据您的解答,通过您提供的方案确实获取到了Token值,但是新的问题出现,在发送Http请求时报错。

    2015年11月9日 9:27
  • Hi,

    我对比了一下,通过你这种方式获取到的Token值,和通过本地应用程序获取的Token值是不一样的,我通过本地应用程序获取的Token值是可以成功发起请求,并获取的响应内容。

    但是通过您提供的方式,虽然获取到了Token值,但是把这个token值加入到请求头中,不能成功发起请求,也就没法获取到响应内容。

    通过两种方式获取的Token值是不一样的。

    Regards

    2015年11月10日 6:59
  • Hi,

    很高兴你解决了问题并成功的获取了相应内容。据我所知,本地客户端程序和Web应用程序这两种方式获取的token确实是不一样的,所以我们在往AD里添加程序时一定要选择正确的程序类型,如果是本地客户端程序,那么我们勾选“本地客户端”,如果是web应用程序或Web API,那么我们勾选“Web 应用程序和/或 Web API”,你可以阅读这篇文章:http://www.windowsazure.cn/documentation/articles/active-directory-authentication-scenarios/了解更多详细信息。

    Best Regards,

    Jambor


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.



    2015年11月10日 7:17
    版主
  • Thanks Jambor
    2015年11月11日 5:41
  • Hi Jambo,

    我根据此文档(https://msdn.microsoft.com/zh-cn/library/azure/ee460782.aspx#bk_cert)进行身份验证,但是遇到的一个错误,错误信息:

    AADSTS90014: The request body must contain the following parameter: 'client_secret or client_assertion'.

    和文档上一致,我使用的也是Web应用程序

    我并不想使用以下代码获取:

    AuthenticationResult result = null;
                try
                {
                    ClientCredential cc = new ClientCredential("clientID", "clientSecret");
                    result = authContext.AcquireToken(graphResourceId, cc);
                }
                catch (AdalException ex)
                {
                    if (ex.ErrorCode != "user_interaction_required")
                    {
                        // An unexpected error occurred.
                        MessageBox.Show(ex.Message);
                    }
    
                    // If user interaction is required, proceed to main page without singing the user in.
                    return;
                }

    2015年11月13日 7:57
  • Hi,

    是的我看到你的sample code中确实出现了上述错误,你的sample中获取token的方式是不正确的,请阅读这篇文章以了解我们在Azure AD中验证的原理:https://msdn.microsoft.com/zh-cn/library/azure/dn645542.aspx,如果你是使用web程序来管理你的用户的话,还是建议你参照我给你的sample code去做。

    Best Regards,

    Jambor 


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年11月13日 8:08
    版主
  • Hi,

    请问您获取到了Azure AD中的用户了吗?并可以操作Azure AD中用户?

    2015年11月17日 1:46
  • Hi,

    在我邮件给你的sample code中的User List中可以得到Azure AD的用户,而且你可以通过我给你的账户新增用户,如果OneDrive不可以打开的话,请尝试我Email给你的百度云链接。

    Best Regards,

    Jambor


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年11月17日 2:20
    版主
  • Hi,

    这个sample code我已经有了,我的意思是您运行这个sample code获得到了您的Azure订阅中的用户了?并且可以操作这些用户?

    2015年11月17日 2:29
  • 这个不是获取Azure订阅的用户,而是获取Azure AD中的用户,如果你是想获取Azure订阅中的用户的话,请尝试这个Rest API: https://msdn.microsoft.com/zh-cn/library/azure/dn469420.aspx, 关于在订阅中新增用户或者删除的话,据我所知目前中国版并不支持。

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年11月17日 3:18
    版主
  • 好吧,那您获取到Azure AD中的用户了吗?
    2015年11月17日 3:46
  • 是的,sample code在你那没跑成功?


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年11月17日 4:46
    版主
  • 跑不起来,不知道怎么回事
    2015年11月17日 4:58
  • Hi Janbor,

    我这里有一个问题,如图:

    2015年11月17日 8:52
  • 应用程序ID URI的格式是:https://<your_tenant_name>/WebAppGraphAPI, <your_tenant_name>就是你在上述图片中的jahwa.partner.onmschina.cn.

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 Rampb 2015年11月18日 3:55
    2015年11月18日 1:18
    版主
  • 登录URL是随便填吗?

    2015年11月18日 1:45
  • 不是的,我们可以在VS里面找到这个值:

    如果你将程序发布到Cloud Service,你需要修改Sign-on URL和Reply URL,我将我之前给你的demo发布到Cloud Service理,这个是地址:http://test1323.chinacloudapp.cn/Users,以这个为例,登录URL就要改成:https://test1323.chinacloudapp.cn/, Reply URL就要改成:http://test1323.chinacloudapp.cn/(web.config和Azure门户都要修改)。你可以按我之前给你的测试账号去登录测试下。Note:不要忘记URL最后的“/”符号。 

    建议你将这个帖子有用的回复标记成答案,如果有任何新问题,我们可以在新的帖子中继续探讨,非常感谢!


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.




    2015年11月18日 2:26
    版主
  • Hi,

    非常感谢您的耐心解答。

    Thanks

    2015年11月18日 3:55