Azure active directory 使用Azure B2C/.NET Core更新索赔

Azure active directory 使用Azure B2C/.NET Core更新索赔,azure-active-directory,azure-ad-b2c,Azure Active Directory,Azure Ad B2c,我花了一些时间让我的MVC6.NET核心网站与Azure B2C一起工作,一切似乎都很好。然而,有几个问题围绕着我似乎无法想出正确的策略的说法 假设一个用户在我的网站上注册了email,firstname,lastname。注册完成后,我想在数据库中引用该用户的UserProfile表中添加一条记录 问题1: 我应该在Azure B2C中创建“UserProfileId”声明吗?或者我应该在数据库表中创建一个引用AD用户的“ObjectId”字段吗?什么更有意义 问题2: 一旦用户注册,我将在何

我花了一些时间让我的MVC6.NET核心网站与Azure B2C一起工作,一切似乎都很好。然而,有几个问题围绕着我似乎无法想出正确的策略的说法

假设一个用户在我的网站上注册了email,firstname,lastname。注册完成后,我想在数据库中引用该用户的UserProfile表中添加一条记录

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

问题2: 一旦用户注册,我将在何处以及如何更新广告用户声明?我会在这些活动中做吗?还是别的地方?我看到有一个“用户是新的”声明,我可以检查吗

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 });
    });
}
public void ConfigureAuth(IAApplicationBuilder应用程序、IOptions策略设置、AuthenticationHelper authHelper)
{
app.UseCookieAuthentication(选项=>
{
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.postlogutredirecturi=policySettings.Value.postlogutredirecturi;
options.AutomaticAuthenticate=true;
options.AutomaticChallenge=true;
options.ClientId=policySettings.Value.ClientId;
options.CallbackPath=新路径字符串(“/signin mysite”);
options.signnscheme=CookieAuthenticationDefaults.AuthenticationScheme;
options.Scope.Add(“openid”);
选项。范围。添加(“配置文件”);
选项。范围。添加(“电子邮件”);
options.ResponseType=OpenIDConnectResponseType.IdToken;
options.Authority=string.Format(CultureInfo.InvariantCulture,“{0}/{1}”、policySettings.Value.AadInstance、policySettings.Value.Tenant);
options.Events=新的OpenIdConnectEvents{
OnAuthenticationValidated=OnAuthenticationValidated,
OnAuthorizationCodeReceived=OnAuthorizationCodeReceived,
OnAuthenticationFailed=OnAuthenticationFailed,
OnRedirectToAuthenticationEndpoint=OnRedirectToAuthenticationEndpoint
};
options.ConfigurationManager=新策略ConfigurationManager(
格式(CultureInfo.InvariantCulture,“{0}/{1}/{2}/{3}”、policySettings.Value.AadInstance、policySettings.Value.Tenant、“v2.0”、OpenIdProviderMetadataNames.Discovery),
新字符串[]{policySettings.Value.SignUpInPolicyId,policySettings.Value.ProfilePolicyId,policySettings.Value.PasswordPolicyId});
});
}
问题1:我应该在Azure B2C中创建“UserProfileId”声明吗?或者我应该在数据库表中创建一个引用AD用户的“ObjectId”字段吗?什么更有意义

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

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

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

问题2:一旦用户注册,我将在何处以及如何更新广告用户声明?我会在这些活动中做吗?还是别的地方?我看到有一个“用户是新的”声明,我可以检查吗

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

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

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

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

var identity = context.AuthenticationTicket.Principal.Identity as ClaimsIdentity;
identity?.AddClaim(new Claim("EmployeeId", "33"));
我必须再问一次“更新”的问题

你可能想要的是“改变”这些说法。这通常在cookies的
TicketReceived
事件期间完成。这在他们第一次进行身份验证时发生。(不要与注册混淆。)

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

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


HTH

关于问题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);
                }
            }
        });
我是从你那里得到信息的

关于问题3:我自己还没有做过,但是这个链接应该会让你兴奋起来:

希望有帮助