如何获取Azure Active Directory角色或用户组

时间:2014-05-06 12:21:42

标签: c# asp.net-mvc winrt-xaml windows-8.1 adfs

我有一个win 8应用程序,我想根据角色验证ADFS用户。 我发现了一篇文章 http://msdn.microsoft.com/library/azure/dn169448.aspx 这是一篇非常好的文章,将win 8应用程序与Adfs集成,并使用mvc作为广告的webclient。

  AuthenticationContext authenticationContext = new AuthenticationContext("https://login.windows.net/" + domainName);

        AuthenticationResult result = await authenticationContext.AcquireTokenAsync(resourceAppIDUri, clientID);
        if (AuthenticationStatus.Succeeded != result.Status)
        {}

通过使用此代码,用户可以成功通过身份验证,以防万一我想要针对用户组授权用户。有什么办法吗?

ClaimsPrinicipal IsInRole()中有一个方法,但它总是返回false。在Claims集合中,角色或用户组没有任何内容。我在网上搜索并找到了这个链接http://www.cloudidentity.com/blog/2013/01/22/group-amp-role-claims-use-the-graph-api-to-get-back-isinrole-and-authorize-in-windows-azure-ad-apps/

但是这使用了图形API。我想以更简单的方式。无论如何我试图使用图Api但请求 https://graph.windows.net/ {0} /用户(' {1}')/ MemberOf我获得了特权。图表api只能由管理员权限帐户使用。 那么我将如何获取当前用户登录组?

2 个答案:

答案 0 :(得分:0)

该帖子适用于Azure Active Directory。 AAD获取角色的唯一方法是通过Graph API。

您想使用ADFS。 ADFS不支持Graph API。 ADFS以声明的形式提供角色。这使用SAML令牌。

但标题是“ Azure AD IsInRole”?

请编辑问题以明确指出您要定位的拓扑(ADFS / AAD)。

Win 8应用程序是所谓的本机应用程序。这些通常使用OAuth。 OAuth仅在ADFS 3.0中受支持,即Server 2012 R2。

答案 1 :(得分:0)

我使用Graph api找到了解决方案。下面是用户登录后使用claimprinicipal参数的方法。我使用上面指定的链接登录用户。

private async void GetToken(ClaimsPrincipal claimsPrincipal)
        {
            string upn = claimsPrincipal.FindFirst(
                 "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn").Value;
            string tenantID = claimsPrincipal.FindFirst(
      "http://schemas.microsoft.com/identity/claims/tenantid").Value;
             string requestUrl = string.Format("https://graph.windows.net/{0}/users/{1}/memberOf?api-version=2013-04-05",
            tenantID, upn);

            string appPrincipalID = "152313bf-2566-4bbb-8160-06013dc45679";//This is the cliend id you get after creating web api on azure 
            string appKey = "XP7rvrbzOXl6n94STPgI6LTqU1fOTje4cu+Cererererer8nE=";//generate it on web app on azure 

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(String.Format(
                      "https://login.windows.net/{0}/oauth2/token?api-version=1.0",
                      domainName));
            System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
            string postData = "grant_type=client_credentials";
            postData += "&resource=" + HttpUtility.UrlEncode("https://graph.windows.net");
            postData += "&client_id=" + HttpUtility.UrlEncode(appPrincipalID);
            postData += "&client_secret=" + HttpUtility.UrlEncode(appKey);
            byte[] data = encoding.GetBytes(postData);
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = data.Length;
            //string authorizationHeader = string.Empty;
            Models.AADJWTToken token = null;

            using (Stream stream = request.GetRequestStream())
            {
                stream.Write(data, 0, data.Length);
                stream.Flush();
                using (var response = request.GetResponse())
                {
                    using (var stream1 = response.GetResponseStream())
                    {
                        using (var reader = new StreamReader(stream1))
                        {
                            string str = await reader.ReadToEndAsync();
                            token = Newtonsoft.Json.JsonConvert.DeserializeObject<Models.AADJWTToken>(str);                              
                        }
                    }
                }
            }

           HttpClient httpClient = new HttpClient();
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(token.TokenType, token.AccessToken);
           var re = await httpClient.GetAsync(requestUrl);
            var se = await re.Content.ReadAsStringAsync();

         //this variable hold your result with user group in json format.


        }