使用Azure B2C / .NET Core更新声明

时间:2016-06-09 19:49:57

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

我花了一些时间让我的MVC 6 .NET Core网站与Azure B2C一起工作,一切似乎都很有效。但是,有几个问题围绕着我似乎无法找出正确策略的说法。

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

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

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

2 个答案:

答案 0 :(得分:0)

  

问题1:我应该创建一个&#34; UserProfileId&#34;在Azure B2C声称?或者我应该创建一个&#34; ObjectId&#34;我的数据库表中引用AD用户的字段?什么会更有意义?

1a - 我没有向B2C租户添加任何东西。

1b - 我从B2C获取对象id并将其作为备用密钥存储在我的表中。我的桌子有一个独特的id。我是否希望拥有其他身份提供者,这是必要的。

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

  

问题2:用户注册后,我在何处以及如何更新AD用户声明?我会在其中一个活动中做到吗?或者别的地方?我看到有一个&#34;用户是新的&#34;声称我可以检查?

当您说&#34;更新声明&#34;您是指在B2C租户中永久更新,还是意味着将其添加到其他声明并在此特定令牌的生命周期内暂时使用?

没有使用图形客户端,没有连接回B2C。

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

  

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

我要问&#34;更新&#34;再问一次。

您可能正在寻找的是&#34;转换&#34;索赔。这通常是在Cookie TicketReceived事件期间完成的。当他们第一次进行身份验证时会发生这种情况。 (不要与注册相混淆。)

我并不是那么聪明,但我会告诉你,我花了太多时间试图把它弄好。它主要是因为有大量的选项,没有人可以告诉你所有正确的项目。因此,您只需查看大量信息即可找到所需的位数。

我发现this book(以及它的作者)非常有帮助。它是现在的,他是一个写得非常好的微软人。

HTH

答案 1 :(得分: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);
                }
            }
        });

我从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

希望有所帮助!