我成功地设置了一个ADFS4.0实例(Windows 2016),我打算使用该实例来验证和授权面向WebApi的单页应用程序的用户。
我基本上遵循了这个教程:https://learn.microsoft.com/en-us/windows-server/identity/ad-fs/development/single-page-application-with-ad-fs ..。它正在修改使用Azure的示例。
现在.。一切看起来都很好,我可以从/oauth2/authorize端点获得一个基本的JWT令牌:
{
"aud": "d668d637-7fd4-45ef-9eab-46fee230dcbc",
"iss": "https://fs.contoso.com/adfs",
"iat": 1494341035,
"exp": 1494344635,
"auth_time": 1494341035,
"nonce": "c91e3f78-c31a-402e-a685-8d1586915227",
"sub": "Rl7sOj0nDbgh8BVWZegrkvgAKaB/SwNuEbmORcWcae4=",
"upn": "john.doe@contoso.com",
"unique_name": "CONTOSO\\JohnDoe"
}来自AzureAD的令牌包含更多的属性,特别是family_name和given_name。但我也希望在令牌中添加明确的组声明。我认为我应该能够通过在Web应用程序属性(应用程序组-> MyApp -> MyApp - WebApplication -> Properties)中正确设置“发布转换规则”来实现这一点。但是,不管我做什么,似乎对端点返回的JWT中包含的属性没有任何影响。我总是得到完全相同的标记结构。

我不太清楚“传出声明”是如何映射到令牌属性的,因为除了“UPN”和“唯一名称”之外,什么都没有传递。我在这里可能做错了什么?
发布于 2017-05-11 12:40:09
正如nzpcmad的答案所示,似乎不支持在id_token中使用默认的URL参数编码的GET重定向的自定义声明。原因可能是有一个URL长度限制,但我发现这是相当值得怀疑的。
无论如何,当令牌在POST重定向中返回时,此限制显然不适用。这也是为什么人们描述它在MVC应用程序中工作得很好的原因。
因此,我能够通过将响应重定向到后端API端点(POST)来解决这个问题,后者只是再次将其重定向到前端(SPA),但作为带有URL端编码参数的GET请求:
public class LoginController : ApiController
{
[HttpPost]
[Route("login")]
public HttpResponseMessage Login(FormDataCollection formData)
{
var token = formData["id_token"];
var state = formData["state"];
var response = Request.CreateResponse(HttpStatusCode.Moved);
var frontendUri = ConfigurationManager.AppSettings["ad:FrontendUri"];
response.Headers.Location = new Uri($"{frontendUri}#id_token={token}&state={state}");
return response;
}
}注意,要将响应方法从GET更改为POST,只需将&response_mode=form_post添加到OAuth请求URL。
发布于 2017-05-09 19:08:03
Windows Server 2016是ADFS 4.0。
SPA使用OAuth隐式流,并且有大量的帖子表明这个流不允许额外的声明,特别是当您使用ADAL时。
https://stackoverflow.com/questions/43873379
复制相似问题