我成功设置了一个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"
}
Run Code Online (Sandbox Code Playgroud)
来自AzureAD的令牌包含更多属性,特别是family_name和given_name.但我也希望在令牌上添加明确的群组声明.我认为我应该能够通过在Web应用程序属性(应用程序组 - > MyApp - > MyApp - WebApplication - >属性)中正确设置"颁发转换规则"来实现这一点.但是,无论我做什么,似乎没有任何东西对从端点返回的JWT中包含的属性有任何影响.我总是得到完全相同的令牌结构.
我不太确定'Outgoing Claims'如何映射到令牌属性,除了'UPN'和'唯一名称'之外似乎都没有传输.我在这里做错了什么?
正如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;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,要将响应方法从GET更改为POST,只需添加&response_mode=form_post到OAuth请求URL即可.
| 归档时间: |
|
| 查看次数: |
4281 次 |
| 最近记录: |