我有一个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只能由管理员权限帐户使用。 那么我将如何获取当前用户登录组?
答案 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.
}