当前位置: 首页 > 知识库问答 >
问题:

Azure应用程序服务身份验证/授权和自定义JWT令牌

林威
2023-03-14

在我的网络项目中,我想让用户使用用户名/密码和微软帐户登录。技术-堆栈:

  • Asp.网络核心
  • Azure应用服务

首先,我创建了用户名/密码登录。这样地:

启动。反恐精英:

        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(Configuration["JWTKey"].ToString())),
                ValidateIssuer = false,
                ValidateAudience = false,
                ValidateLifetime = true

            };
        });

登录方式:

    public async Task<IActionResult> ClassicAuth(AuthRequest authRequest)
    {
        tbl_Person person = await _standardRepository.Login(authRequest.Username, authRequest.Password);

        if (person != null)
        {

            var claims = new[]
            {
                    new Claim(ClaimTypes.GivenName, person.PER_T_Firstname),
            };

            var key = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(_config["JWTKey"].ToString()));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha512Signature);
            var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(claims),
                Expires = DateTime.Now.AddHours(24),
                SigningCredentials = creds
            };
            var tokenHandler = new JwtSecurityTokenHandler();
            var token = tokenHandler.CreateToken(tokenDescriptor);

            return Ok(tokenHandler.WriteToken(token));
        }
        else
            return Unauthorized("Invalid login data");
    }

并通过[授权]保护我的api enpoints。到现在为止,一直都还不错。。。这很有效。

现在我想html" target="_blank">添加一个登录方法与Microsoft帐户。我使用Azure应用服务身份验证/授权(https://docs.microsoft.com/de-de/azure/app-service/overview-authentication-authorization)。

我配置了身份验证提供商,我可以在我的角应用程序中使用自定义链接启动身份验证流程:

<a href="https://mysite.azurewebsites.net/.auth/login/microsoftaccount">Login with Microsoft - Account</a>

这可以工作,我可以通过以下方式从我的angular应用程序中检索访问令牌:

this.httpClient.get("https://mysite.azurewebsites.net/.auth/me").subscribe(res => {
  console.log(res[0].access_token);
});

现在的问题是:

access_令牌似乎不是有效的JWT令牌。如果我复制令牌并转到https://jwt.io/它是无效的。

当我将令牌传递给我的API时,我得到一个401响应。使用似乎合乎逻辑,因为我的API检查JWT令牌是否使用我的自定义JWT密钥签名,而不是使用来自Microsoft的密钥签名。

如何使两种登录方法协同工作?我现在可能有一些基本的理解问题。

共有1个答案

长孙深
2023-03-14

看起来你希望你的Angular应用程序调用ASP。NET核心Web API由Azure Active Directory保护,下面是一个很好的示例。

顺便说一下,如果你想让用户在Azure中使用多种方式登录一个项目,你可以使用多个登录提供商。

 类似资料:
  • 我们正在尝试找出IPC身份验证和授权的最佳实践。我会解释的。我们有一个基于微服务的体系结构SaaS和一个专门的认证服务。该服务负责执行身份验证和管理身份验证令牌(JWT)。 现在的问题是如何验证和授权由其他服务发起的请求(没有特定用户的上下文)? 我们是否应该为每个服务生成一个专用用户,并像对待系统中的任何其他用户一样对待它(具有适当的权限)? 我们是否应该在服务之间部署“硬编码”/动态令牌? 还

  • 嗨,伙计们,我正在开发应用程序使用spring boot和spring security在我的应用程序中进行身份验证,我使用自定义令牌,并且我能够成功地对用户进行身份验证。现在我想添加自定义授权到我的应用程序我想通过以下方式进行授权: 我的自定义userDetails服务如下:

  • 我实现了一个自定义的身份验证过滤器,效果很好。在设置会话并将身份验证对象添加到安全上下文后,我使用外部身份提供程序并重定向到最初请求的URL。 安全配置 过滤逻辑 目前,我的自定义过滤器(身份确认后)只需硬编码一个角色: 然后将该身份验证对象(上面返回)添加到我的SecurityContext,然后再重定向到所需的endpoint: SecurityContextHolder.getContext

  • 我目前有一个使用Azure移动应用程序的后端解决方案。我已经启用了facebook、twitter、google和Microsoft登录。除此之外,我正在尝试添加一个自定义登录流。我已经设置了一个Auth0帐户和应用程序,当我在应用程序中使用auth0 lock小部件发出请求时,我能够从auth0获得令牌和配置文件。 我遵循了本指南:https://shellmonger.com/2016/04/

  • 我按照微软的文章实现了我自己的发行者验证(“定制令牌验证”是这一节的标题)。 这似乎适用于仅在应用程序上下文中发布的JWT令牌,但是当对我的API的第一次调用是通过用户委托发布的JWT令牌时就失败了。 我发现这行代码导致了问题: 这是我上面发布的链接中的原始代码。我通过以下方式实现了自己的发行人验证: 我有一个多租户应用,所以我只需要让一些租户通过并拒绝最多。 这个解决方案的行为有点奇怪: 使用仅

  • 我的webapp是用。NET核心并部署在Azure中。我已启用Azure应用程序服务身份验证,并将其配置为使用Azure Active Directory。当我访问webapp时,我确实会被重定向到正确的登录页面。登录后,我可以浏览到endpoint。对我进行身份验证,并查看是否存在针对我的用户的声明。我还可以验证下面的请求标头是否存在值: X-MS-TOKEN-AAD-ID-TOKEN X-MS