2016-06-09 59 views
1

我花了一些時間讓我的MVC 6 .NET Core網站與Azure B2C一起工作,一切似乎都很順利。然而,圍繞這些說法有幾個問題,我似乎無法找出正確的策略。使用Azure B2C/.NET Core更新聲明

說一個用戶在我的網站上註冊電子郵件,名字,姓氏。一旦註冊完成後,我想添加一條記錄到我的數據庫中引用此用戶的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 }); 
    }); 
} 

回答

0

問題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

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

希望幫助!