我按照微软的文章实现了我自己的发行者验证(“定制令牌验证”是这一节的标题)。
这似乎适用于仅在应用程序上下文中发布的JWT令牌,但是当对我的API的第一次调用是通过用户委托发布的JWT令牌时就失败了。
我发现这行代码导致了问题:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration);
services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
{
var existingOnTokenValidatedHandler = options.Events.OnTokenValidated;
options.Events.OnTokenValidated = async context =>
{
await existingOnTokenValidatedHandler(context);
// Your code to add extra configuration that will be executed after the current event implementation.
options.TokenValidationParameters.ValidIssuers = new[] { /* list of valid issuers */ };
options.TokenValidationParameters.ValidAudiences = new[] { /* list of valid audiences */};
}
});
这是我上面发布的链接中的原始代码。我通过以下方式实现了自己的发行人验证:
services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
{
var existingOnTokenValidatedHandler = options.Events.OnTokenValidated;
options.TokenValidtionParameters.RoleClaimType = "roles";
options.Events.OnTokenValidated = async context =>
{
await existingOnTokenValidatedHandler(context);
options.Authority = "https://login.microsoftonline.com/common";
var validTenants = FileTenantStore.Tenants.Select(x => x.AzureAdTenantId).ToList();
options.TokenValidationParameters.ValidIssuers = GetValidIssuers(validTenants);
options.TokenValidationParameters.IssuerValidator = ValidateIssuers;
};
});
我有一个多租户应用,所以我只需要让一些租户通过并拒绝最多。
这个解决方案的行为有点奇怪:
无法验证令牌。Microsoft.IdentityModel.Tokens.SecurityTokenInvalidIssuerException: IDW10303: Issuer: 'https://login.microsoftonline.com/{OUR_TENANT_ID}/v2.0' 与为此应用程序提供的任何有效颁发者都不匹配。at Microsoft.Identity.Web.Resource.AadIssuerValidator.Validate(String actualIssuer, SecurityToken securityToken, TokenValidationParameters validationParameters) at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateIssuer(String issuer, JwtSecurityToken jwtToken, TokenValidationParameters validationParameters) at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateTokenPayload(JwtSecurityToken jwtToken, TokenValidationParametersvalidationParameters) at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken
所以在这种情况下,永远不会调用“OnTokenVal的”。
我可以通过将“OnTokenValidated”-回调中的行移动到上方一级来解决此问题:
services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
{
var existingOnTokenValidatedHandler = options.Events.OnTokenValidated;
options.TokenValidationParameters.RoleClaimType = "roles";
var validTenants = FileTenantStore.Tenants.Select(x => x.AzureAdTenantId).ToList();
options.TokenValidationParameters.ValidIssuers = GetValidIssuers(validTenants);
options.TokenValidationParameters.IssuerValidator = ValidateIssuers;
options.Events.OnTokenValidated = async context =>
{
await existingOnTokenValidatedHandler(context);
options.Authority = "https://login.microsoftonline.com/common";
};
});
我现在甚至可以删除回调“OnTokenValidated”,但这感觉不对,因为微软的文章给出了明确的说明
我可以这样做吗,或者我的解决方案是安全问题吗?
如果你在netcore
根据您的代码:
services.AddMicrosoftIdentityWebApiAuthentication(Configuration,
jwtBearerScheme: JwtBearerDefaults.AuthenticationScheme,
subscribeToJwtBearerMiddlewareDiagnosticsEvents: true);
在我的网络项目中,我想让用户使用用户名/密码和微软帐户登录。技术-堆栈: Asp.网络核心 角 Azure应用服务 首先,我创建了用户名/密码登录。这样地: 启动。反恐精英: 登录方式: 并通过[授权]保护我的api enpoints。到现在为止,一直都还不错。。。这很有效。 现在我想添加一个登录方法与Microsoft帐户。我使用Azure应用服务身份验证/授权(https://docs.mic
我正在尝试使用Azure VM连接器来启动和停止虚拟机。当我编辑逻辑应用程序时,它使用我的用户Id进行身份验证(成功)。但是,我的用户Id与VM位于不同的租户中。启动虚拟机连接器允许您指定SubscriptionId、ResourceGroup和VM名称,但不能指定租户ID。当我尝试运行Logic应用程序时,我收到一个授权(401)错误(InvalidAuthenticationTokenTena
于是我在这里看到:https://firebase . Google . com/docs/auth/web/account-linking # link-auth-provider-credentials-to-a-user-account现在可以在Firebase中链接用户账号了。我还看到Firebase提供了匿名认证的功能,它为一个用户创建一个用户会话,不需要任何凭证。 在我们的应用程序中,
我已配置Identity Server 4并使用Azure AD身份验证。如果我在身份服务器中使用租户特定的授权URL,一切都可以正常工作。这样,只有该租户的用户才能登录。我希望允许多个域登录,并希望在后端验证发行者。 为了支持这一点,我需要使用Azure AD的通用登录endpoint,在我登录后,当它重定向到Identity Server的登录endpoint时,我收到以下错误。我应该做什么配
我需要保护我的spring boot应用程序,这是我所拥有的: null 我知道spring boot的web安全特性,但是没有足够的信息来说明如何与自定义令牌一起使用这些特性。
我目前有一个使用Azure移动应用程序的后端解决方案。我已经启用了facebook、twitter、google和Microsoft登录。除此之外,我正在尝试添加一个自定义登录流。我已经设置了一个Auth0帐户和应用程序,当我在应用程序中使用auth0 lock小部件发出请求时,我能够从auth0获得令牌和配置文件。 我遵循了本指南:https://shellmonger.com/2016/04/