【问题标题】:Updating claims with Azure B2C / .NET Core使用 Azure B2C / .NET Core 更新声明
【发布时间】:2017-05-15 04:05:53
【问题描述】:

我花了一些时间让我的 MVC 6 .NET Core 网站与 Azure B2C 一起工作,一切似乎都运行良好。但是,围绕声明存在一些问题,我似乎无法找出正确的策略。

假设用户使用电子邮件、名字、姓氏在我的网站上注册。注册完成后,我想在我的数据库中的 UserProfile 表中添加一条引用该用户的记录。

问题 1: 我应该在 Azure B2C 中创建“UserProfileId”声明吗?或者我应该在我的数据库表中创建一个引用 AD 用户的“ObjectId”字段?什么更有意义?

问题 2: 用户注册后,我将在何处以及如何更新 AD 用户声明?我会在这些事件之一中这样做吗?或者别的地方?我看到有一个“用户是新用户”声明可以检查?

OnAuthenticationValidated
OnAuthorizationCodeReceived
OnRedirectToAuthenticationEndpoint

问题 3: 要更新声明,我会使用:Microsoft.Azure.ActiveDirectory.GraphClient?有没有人有任何关于如何更新自定义声明的示例代码?我已经尝试过了,但它似乎并没有持续存在:

var identity = context.AuthenticationTicket.Principal.Identity as ClaimsIdentity;
identity?.AddClaim(new Claim("EmployeeId", "33"));

这是我的身份验证配置。谢谢!!!!!!

public void ConfigureAuth(IApplicationBuilder app, IOptions<PolicySettings> policySettings, AuthenticationHelper authHelper)
{
    app.UseCookieAuthentication(options =>
    {
        options.AutomaticAuthenticate = true;
        options.AutomaticChallenge = true;
        options.AccessDeniedPath = "/Home/Forbidden";
        options.CookieSecure = CookieSecureOption.Always;
        options.ExpireTimeSpan = TimeSpan.FromHours(1);
        options.SlidingExpiration = true;
    });

    app.UseOpenIdConnectAuthentication(options =>
    {
        options.PostLogoutRedirectUri = policySettings.Value.PostLogoutRedirectUri;
        options.AutomaticAuthenticate = true;
        options.AutomaticChallenge = true;
        options.ClientId = policySettings.Value.ClientId;
        options.CallbackPath = new PathString("/signin-mysite");
        options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.Scope.Add("openid");
        options.Scope.Add("profile");
        options.Scope.Add("email");
        options.ResponseType = OpenIdConnectResponseTypes.IdToken;
        options.Authority = string.Format(CultureInfo.InvariantCulture, "{0}/{1}", policySettings.Value.AadInstance, policySettings.Value.Tenant);
        options.Events = new OpenIdConnectEvents {
            OnAuthenticationValidated = OnAuthenticationValidated,
            OnAuthorizationCodeReceived = OnAuthorizationCodeReceived,
            OnAuthenticationFailed = OnAuthenticationFailed,
            OnRedirectToAuthenticationEndpoint = OnRedirectToAuthenticationEndpoint
        };
        options.ConfigurationManager = new PolicyConfigurationManager(
            String.Format(CultureInfo.InvariantCulture, "{0}/{1}/{2}/{3}", policySettings.Value.AadInstance, policySettings.Value.Tenant, "v2.0", OpenIdProviderMetadataNames.Discovery),
            new string[] { policySettings.Value.SignUpInPolicyId, policySettings.Value.ProfilePolicyId, policySettings.Value.PasswordPolicyId });
    });
}

【问题讨论】:

    标签: azure-active-directory azure-ad-b2c


    【解决方案1】:

    问题 1:我应该在 Azure B2C 中创建“UserProfileId”声明吗?或者我应该在我的数据库表中创建一个引用 AD 用户的“ObjectId”字段?什么更有意义?

    1a - 我没有向 B2C 租户添加任何内容。

    1b - 我从 B2C 获取对象 ID,并将其作为备用键存储在我的表中。我的表有它自己的唯一 ID。如果我希望有额外的身份提供者,这将是必要的。

    我只使用 B2C 的对象 id 来查找用户并获取我自己的 id。

    问题 2:一旦用户注册,我将在哪里以及如何更新 AD 用户声明?我会在这些事件之一中这样做吗?或者别的地方?我看到有一个“用户是新用户”声明可以检查?

    当您说“更新声明”时,您是指在 B2C 租户中永久更新,还是将其添加到其他声明中并在此特定令牌的生命周期内临时使用它?

    如果不使用图形客户端,则无法连接回 B2C。

    userIsNew 声明来自 B2C 一次,并且仅在注册过程结束时。您可以使用它来确定是否有新用户尝试访问您的系统。我使用它来根据 B2C 给我的声明在我的表中创建新条目,从那时起,所有声明都来自我表中的信息。

    问题 3:要更新声明,我是否会使用:Microsoft.Azure.ActiveDirectory.GraphClient?有没有人有任何关于如何更新自定义声明的示例代码?我已经尝试过了,但它似乎并没有持续存在:

    我得再问一次“更新”的问题。

    您可能正在寻找的是“转换”声明。这通常在 cookie 的 TicketReceived 事件期间完成。这发生在他们第一次认证时。 (不要与注册混淆。)

    我不是那么聪明,但我会告诉你,我在这方面花了太多时间试图把它做好。主要是因为有大量的选项,没有人能告诉你所有适合你的项目的选项。因此,您只会看到大量信息,您可以通过这些信息找到所需的信息。

    我发现this book(和它的作者)非常有帮助。这是最新的,他是一个写得很好的微软人。

    HTH

    【讨论】:

      【解决方案2】:

      关于问题 1:我和 nhwilly 做了同样的事情:我将附加信息存储在我的数据库中。

      关于问题 2:您可以在 OnsigningIn 事件中添加声明:

      app.UseCookieAuthentication(new Microsoft.AspNetCore.Builder.CookieAuthenticationOptions()
              {
                  Events = new CookieAuthenticationEvents()
                  {
                      OnSigningIn = (context) =>
                      {
                          ClaimsIdentity identity = (ClaimsIdentity)context.Principal.Identity;
                          identity.AddClaim(new Claim("sb:tID", "555"));
                          return Task.FromResult(0);
                      }
                  }
              });
      

      我从Transforming Open Id Connect claims in ASP.Net Core得到信息。

      关于问题 3:我自己没有做过,但是这个链接应该让你开始:https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet

      希望有帮助!

      【讨论】:

        猜你喜欢
        • 2019-12-16
        • 1970-01-01
        • 2017-07-04
        • 2019-05-30
        • 2020-10-25
        • 2021-10-02
        • 1970-01-01
        • 2018-12-19
        • 1970-01-01
        相关资源
        最近更新 更多