Angularjs 如何在adal的httpinterceptor发送的承载中添加声明

Angularjs 如何在adal的httpinterceptor发送的承载中添加声明,angularjs,asp.net-web-api,azure-active-directory,owin,adal,Angularjs,Asp.net Web Api,Azure Active Directory,Owin,Adal,在angularjs应用程序中,我使用adal和adal angular库对Azure AD上的用户进行身份验证。在后端,我在webAPI中使用OWIN中间件添加自定义声明,包括: app.UseWindowsAzureActiveDirectoryBearerAuthentication(new WindowsAzureActiveDirectoryBearerAuthenticationOptions { Audience = ConfigurationManager.AppSett

在angularjs应用程序中,我使用adal和adal angular库对Azure AD上的用户进行身份验证。在后端,我在webAPI中使用OWIN中间件添加自定义声明,包括:

app.UseWindowsAzureActiveDirectoryBearerAuthentication(new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
    Audience = ConfigurationManager.AppSettings["ida:Audience"],
    Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
    Provider = new OAuthBearerAuthenticationProvider()
    {
        OnValidateIdentity = async context =>
        {
            if(!context.IsValidated)
                return;

            var userManager = context.OwinContext.Get<UserManager>();
            string email = context.Ticket.Identity.GetClaimValue(System.Security.Claims.ClaimTypes.Email);
            User user = userManager.GetByEmail(email);

            context.Ticket.Identity.AddClaim(new Claim(ClaimTypes.UserId, user.Id.ToString(CultureInfo.InvariantCulture));
        }
    }
});
app.UseWindowsAzureActiveDirectoryBeareAuthentication(新WindowsAzureActiveDirectoryBeareAuthenticationOptions
{
受众=ConfigurationManager.AppSettings[“ida:受众”],
Tenant=ConfigurationManager.AppSettings[“ida:Tenant”],
Provider=新的OAuthBeareAuthenticationProvider()
{
OnValidateIdentity=异步上下文=>
{
如果(!context.IsValidated)
返回;
var userManager=context.OwinContext.Get();
字符串email=context.Ticket.Identity.GetClaimValue(System.Security.Claims.ClaimTypes.email);
User=userManager.GetByEmail(电子邮件);
context.Ticket.Identity.AddClaim(新声明(ClaimTypes.UserId,user.Id.ToString(CultureInfo.InvariantCulture));
}
}
});

对于当前请求是可行的,但是如何在adal angular的httpinterceptor发送的承载中添加声明以用于下一个请求?

回答您的直接问题:您不能修改访问令牌,句号。 它有一个数字签名,如果您更改令牌中的任何内容,该签名将不再有效。 这是一种防止篡改的安全措施。 您的OWIN中间件在启动时从Azure AD下载签名密钥对的公钥,并使用这些公钥验证令牌

现在,如果您将内部ID存储为扩展属性, 实际上,可以告诉Azure AD将其包含在代币中。 但此功能处于预览状态,不建议在生产中使用:。 在这里,您可以将内部id设置为用户实体上的扩展,并将其包含在API的访问令牌中

解决您的问题的实用解决方案可能是内存缓存。
电子邮件多久更改一次?

如果我理解正确,这将不起作用,因为令牌是从您的可信身份提供商处签名的,您将无法在客户端内更改它。我只想从客户端发送一个自定义的承载者,而不是在每个请求中添加声明。我只想在第一个请求中添加声明er认证并将其包含在bearerI中我知道,但我认为并希望这是不可能的。@juunas你能确认这一点吗?是的,出于安全原因。如果客户能够操纵索赔,我就不能再信任他们了。同意@MartinBrandl 1000%,你就不能这样做(希望没有人能够这样做)。这是固有的。感谢确认GOK,感谢您的时间和解释。电子邮件永远不会更改。我还有一个用于简单登录/密码身份验证的授权服务器。我可以在此授权服务器上重定向Azure AD身份验证以生成另一个具有用户id的令牌吗?@juunas您可以看看我的答案并请告诉我这是否是将身份从Azure AD更改为应用程序身份的好方法?谢谢您的帮助