2

我花了一些时间让我的 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 });
    });
}
4

2 回答 2

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?有没有人有任何关于如何更新自定义声明的示例代码?我已经尝试过了,但它似乎并没有持续存在:

我不得不再次问“更新”问题。

您可能正在寻找的是“转换”声明。这通常在TicketReceivedcookie 活动期间完成。当他们第一次进行身份验证时会发生这种情况。(不要与注册混淆。)

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

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

高温高压

于 2017-04-14T21:07:18.093 回答
0

关于问题 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);
                }
            }
        });

我从ASP.Net Core 中的 Transforming Open Id Connect 声明中获得了信息。

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

希望有帮助!

于 2017-05-14T20:05:53.433 回答