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

时间:2017-05-09 15:03:11

标签: oauth-2.0 adfs

我成功设置了一个ADFS 4.0实例(Windows Server 2016),我打算用它来验证和授权单页面应用程序的用户使用WebApi。

我几乎遵循了本教程:https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/development/single-page-application-with-ad-fs ..正在修改使用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中的令牌包含更多属性,尤其是family_namegiven_name。但我也希望在令牌上添加明确的群组声明。我认为我应该能够通过在Web应用程序属性(应用程序组 - > MyApp - > MyApp - WebApplication - >属性)中正确设置'Issuance Transform Rules'来实现这一点。但是,无论我做什么,似乎都没有对端点返回的JWT中包含的属性产生任何影响。我总是得到完全相同的令牌结构。

Edit Rule Dialog

我不确定'Outgoing Claims'如何映射到令牌属性,除了'UPN'和'唯一名称'之外似乎没有传输。我在这里做错了什么?

2 个答案:

答案 0 :(得分:5)

正如nzpcmad的回答所示,似乎不支持使用默认的URL参数编码的GET重定向在id_token中的自定义声明。原因可能是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请求网址即可。

答案 1 :(得分:1)

Windows Server 2016是ADFS 4.0。

SPA使用OAuth隐式流,并且此处有很多帖子表明此流程不允许额外声明,尤其是在您使用ADAL时。

e.g。 ADFS 4.0, Adal JS - No claims