Oauth 2.0 使用ADFS 4.0 OAuth2令牌获取组声明

Oauth 2.0 使用ADFS 4.0 OAuth2令牌获取组声明,oauth-2.0,adfs,Oauth 2.0,Adfs,我成功地设置了一个ADFS 4.0实例(Windows Server 2016),我打算使用该实例对单页应用程序的用户进行身份验证和授权 我基本上遵循了这个教程:。。正在修改使用Azure Active Directory的示例 现在。。一切似乎都很好,我可以从/oauth2/authorize端点获得一个基本的JWT令牌: { "aud": "d668d637-7fd4-45ef-9eab-46fee230dcbc", "iss": "https://fs.contoso.com/ad

我成功地设置了一个ADFS 4.0实例(Windows Server 2016),我打算使用该实例对单页应用程序的用户进行身份验证和授权

我基本上遵循了这个教程:。。正在修改使用Azure Active Directory的示例

现在。。一切似乎都很好,我可以从
/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的令牌包含更多属性,尤其是
家族名称
给定名称
。但我也希望在令牌中添加明确的组声明。我认为我应该能够通过在Web应用程序属性(应用程序组->MyApp->MyApp-WebApplication->属性)中正确设置“发布转换规则”来实现这一点。然而,无论我做什么,似乎都不会对从端点返回的JWT中包含的属性产生任何影响。我总是得到完全相同的令牌结构


我真的不确定“传出声明”如何映射到令牌属性,因为除了“UPN”和“唯一名称”似乎什么都没有。有人指出我可能做错了什么吗?

Windows Server 2016是ADFS 4.0

SPA使用OAuth隐式流,有很多帖子都建议这个流不允许额外的声明,特别是当您使用ADAL时


e、 g..

如nzpcmad的回答所示,似乎不支持在id_令牌中使用默认URL参数encoded GET redirect的自定义声明。这样做的原因可能是有一个URL长度限制,但我觉得这很有问题

无论如何,显然,在POST重定向中返回令牌时,此限制不适用。这也是为什么人们描述它在MVC应用程序中运行良好的原因

因此,我能够通过将响应重定向到后端API端点(POST)来解决这个问题,后者只是再次将响应重定向到前端(SPA),但作为带有URL endcoded参数的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\u mode=form\u POST
添加到OAuth请求URL即可。

(已编辑)。。不,你对每件事都绝对正确。谢谢!:)我对初始令牌请求进行了处理,但是当涉及到续订请求时,您做了什么来处理?好的,令牌中没有包含续订令牌。要续订令牌,只需再次导航到登录页面-不会再次提示您输入凭据,ADF将使用Cookie(大约)识别您。也就是说,ADFS有一个“让我保持登录”会话,该会话保持活动状态的时间长于令牌生存期。我认为这在ADFS中都是可配置的。在我们的单页应用程序中,我想我们使用了一个隐藏的iframe来转到登录页面,并在不重新加载页面的情况下获取新令牌。我得到的是x-frame拒绝错误。这是来自ADFS(im使用2019),我通过在ADFS服务器上运行Set-AdfsResponseHeaders-RemoveHeaders“X-Frame-Options”修复了它