C# ASP.NET核心3.1+;打开ID连接+;广告没有';t将id令牌持久化到User.Identity中

C# ASP.NET核心3.1+;打开ID连接+;广告没有';t将id令牌持久化到User.Identity中,c#,asp.net-core,authentication,azure-active-directory,openid-connect,C#,Asp.net Core,Authentication,Azure Active Directory,Openid Connect,我正在尝试使用我们公司的Azure AD实现开放Id身份验证,为此,我们使用以下Microsoft指南: 虽然示例项目运行良好,但将相同的方法迁移到我们的网站并不可行。单击“登录”按钮后,用户将正确重定向到外部身份验证(Azure AD),登录后,外部身份验证(Azure AD)将用户重定向回我们的网站。此时一切看起来都不错,如果我们检查对我们网站的外部身份验证回调请求,我们可以看到控制台日志中正确返回了id令牌;但是,这些信息似乎都没有传播/保存到User.Identity对象,这意味着如果我

我正在尝试使用我们公司的Azure AD实现开放Id身份验证,为此,我们使用以下Microsoft指南:

虽然示例项目运行良好,但将相同的方法迁移到我们的网站并不可行。单击“登录”按钮后,用户将正确重定向到外部身份验证(Azure AD),登录后,外部身份验证(Azure AD)将用户重定向回我们的网站。此时一切看起来都不错,如果我们检查对我们网站的外部身份验证回调请求,我们可以看到控制台日志中正确返回了id令牌;但是,这些信息似乎都没有传播/保存到
User.Identity
对象,这意味着如果我们在_LoginPartial.cshtml中使用
User.Identity.IsAuthenticated
,则它始终为空

我怀疑,由于我们的解决方案是在Kentico CMS下构建的,Kentico有自己的Kentico身份验证处理程序,因此我猜它正在清除/覆盖我们的开放id身份验证

是否有办法清除所有已注册的身份验证处理程序?或者其他解决方法?

下面是示例代码,您可以了解我们的实现:

Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {
    . . .

        services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
            .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"));

        . . .

        services.AddRazorPages()
            .AddMicrosoftIdentityUI();
    }

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
    . . .

        app.UseAuthentication();
        app.UseAuthorization();

    . . .
    }
appSettings.json:

  . . .

  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "[Enter the domain of your tenant, e.g. contoso.onmicrosoft.com]",
    "ClientId": "Enter_the_Application_Id_here",
    "TenantId": "Enter_the_Tenant   _Id_here",
    "CallbackPath": "/signin-oidc"
  }

  . . .
_LoginPartial.cshtml

<ul class="navbar-nav">
    @if (User.Identity.IsAuthenticated)
    {
        <li class="nav-item">
            <span class="navbar-text text-dark">Hello @User.Identity.Name!</span>
        </li>
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="SignOut">Sign out</a>
        </li>
     }
    else
    {
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="SignIn">Sign in</a>
        </li>
    }
</ul>
    @if(User.Identity.IsAuthenticated) {
  • 你好@User.Identity.Name!
  • 退出
  • } 其他的 {
  • 登录
  • }

我不确定是什么导致了您的问题,因为我无法理解什么是“传播到User.Identity”和“检查用户是否经过身份验证”。在我看来,在集成azure ad之后,我们需要使用访问令牌和id令牌来获取用户信息。正如示例代码要求您设置重定向url一样,登录模块独立于您的项目。Hi@Tiny wa,因此azure ad日志记录过程似乎运行良好,我们甚至看到id令牌被返回,下一步是在登录部分页面上检查User.Identity.IsAuthenticated属性,以检查用户是否已登录。因此,在这一点上,我的期望是,这个对象将拥有从id令牌返回的所有用户信息,这是不会发生的,user.Identity对象根本没有任何信息。