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

在Asp中使用EasyAuth对Azure应用程序服务上的AAD进行身份验证时,无法填充ClaimsPrincipal。Net核心web应用程序

宫俊远
2023-03-14

我们有一个建立在Asp上的Web应用程序。净核心。它不包含在其中配置的任何身份验证中间件。

我们在Azure应用程序服务上托管,并使用身份验证/授权选项(EasyAuth)对Azure AD进行身份验证。

身份验证工作得很好——我们插入了必要的标头,我们可以在 /.auth/me.看到经过身份验证的身份但是HttpContext。用户属性不会被填充。

这是Asp的兼容性问题吗?净核心?还是我做错了什么?

共有3个答案

史淳
2023-03-14

为此,我编写了一个小型的基本中间件。它将创建一个基于的身份。身份验证/我终结点。身份在身份验证管道中创建,以便[授权]属性和策略与身份一起工作。

你可以在这里找到它:

https://github.com/lpunderscore/azureappservice-authentication-middleware

或者在nuget上:

https://www.nuget.org/packages/AzureAppserviceAuthenticationMiddleware/

添加后,只需将此行添加到启动:

应用程序。UseAzureAppServiceAuthentication();

穆彬郁
2023-03-14

是的,这是兼容性问题。不幸的是,ASP. NET Core不支持将身份信息从IIS模块(如Easy Auth)流到应用程序代码。这意味着HttpContext。用户和类似的代码不会像常规ASP. NET那样工作。

目前的解决方法是调用web应用程序的/。从服务器代码中对endpoint进行身份验证,以获取用户声明。然后,可以使用x-ms-client-principal-id请求头值作为缓存键来缓存该数据。/。auth/me调用需要以与对web应用的调用需要进行身份验证相同的方式进行正确身份验证(auth cookie或请求头令牌)。

毕胡非
2023-03-14

我已经创建了一个自定义中间件,它将填充用户属性,直到Azure团队解决这个问题。

它从应用服务身份验证中读取标头,并创建一个用户,该用户将被[Authorize]识别,并对name拥有声明。

// Azure app service will send the x-ms-client-principal-id when authenticated
app.Use(async (context, next) =>
{

    // Create a user on current thread from provided header
    if (context.Request.Headers.ContainsKey("X-MS-CLIENT-PRINCIPAL-ID"))
    {
        // Read headers from Azure
        var azureAppServicePrincipalIdHeader = context.Request.Headers["X-MS-CLIENT-PRINCIPAL-ID"][0];
        var azureAppServicePrincipalNameHeader = context.Request.Headers["X-MS-CLIENT-PRINCIPAL-NAME"][0];

        // Create claims id
        var claims = new Claim[] {
        new System.Security.Claims.Claim("http://schemas.microsoft.com/identity/claims/objectidentifier", azureAppServicePrincipalIdHeader),
        new System.Security.Claims.Claim("name", azureAppServicePrincipalNameHeader)
        };

        // Set user in current context as claims principal
        var identity = new GenericIdentity(azureAppServicePrincipalIdHeader);
        identity.AddClaims(claims);

        // Set current thread user to identity
        context.User = new GenericPrincipal(identity, null);
    };

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

  • 我正在尝试访问一个我在Azure上托管并用Azure AD保护的API应用程序。 对于API应用程序,我已经设置了App Service Authentication=Azure Active Directory“Express”管理模式。 在“Classic”门户中,我在AD下创建了几个应用程序。一个用于API应用程序,另一个用于Web应用程序。对于Web应用程序,我在API应用程序的“对其他应

  • 问题内容: 简短的问题: 我在.NET中有一个Web API服务,而一个站点仅由HTML和AngularJS组成。 如何仅对我的网站授权给我的服务? 我正在寻找一个似乎很常见但不是常见问题的安全答案。在最近的日子里,我读了很多答案,想法和各种各样的东西,但是找不到解决方案。 假设我有一个来自MS的Web Api服务(最新的)。所以我必须要消耗它的应用程序。让我们定义两个方案。 方案1: 在同一个I

  • react中的前端 基于Spring Boot“resource-service”的后端服务 keycloak 其他后端服务(使用者) 前端和使用者服务都使用REST API与后端通信。我们使用Keycloak作为我们的用户管理和身份验证服务。 我们希望通过提供web应用程序和服务流来将基于Spring的服务“资源服务”与Keycloak集成: > 基于web application-react的

  • 凭据正确。5.7.57 SMTP-客户端未通过身份验证以发送邮件,535 5.7.139身份验证不成功 在中使用SMTP发送电子邮件时返回此错误。网 此应用程序部署在Azure中不确定是什么导致了问题,之前它正在工作,突然停止了。 已尝试使用交换服务器抛出401未授权错误。

  • 我已经在azure中创建了一个web应用,我正在使用azure AD身份验证(OpenID Connect)对我的web应用进行身份验证。但我无法在少数机器上验证web应用。 在一些机器中,它(AAD认证)在谷歌chrome中工作,而不是在IE、Edge、Firefox中工作。 删除了所有cookie和声明 清除会话并在私有模式下测试 当我试图用Azure AAD登录时。我收到了错误消息,比如“我

  • 我需要在我们的Web应用程序中使用LDAP/AD服务器实现SSO身份验证和验证用户。Web应用程序是使用Spring(Java)/Hibernate制作的,应用程序服务器是UAT中的Jboss和生产中的Webphere。 我正在寻找一些好的简单的解决方案,可以帮助我实现它,从几个朋友那里听说华夫饼是一个很好的解决方案,但是在网上搜索并尝试了几天之后,我不确定我是否朝着正确的方向前进。我在这方面很幼

  • 我已经设置了一个广告2016安装。现在打算使用它对web应用程序(java)进行身份验证。我有一段用于测试身份验证的代码,并有一些观察。 现在我在以下场景中测试了用户/密码组合- //第一个组合,user1存在于AD中并且密码正确(测试经过身份验证的绑定)。字符串userid=“user1@domain.com”,password=“user1password”;预期:身份验证成功。实际:身份验证