我成功设置了一个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_name
和given_name
。但我也希望在令牌上添加明确的群组声明。我认为我应该能够通过在Web应用程序属性(应用程序组 - > MyApp - > MyApp - WebApplication - >属性)中正确设置'Issuance Transform Rules'来实现这一点。但是,无论我做什么,似乎都没有对端点返回的JWT中包含的属性产生任何影响。我总是得到完全相同的令牌结构。
我不确定'Outgoing Claims'如何映射到令牌属性,除了'UPN'和'唯一名称'之外似乎没有传输。我在这里做错了什么?
答案 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时。