web-dev-qa-db-ja.com

Azure AD B2C-ロール管理

Azure AD B2Cに接続されたAsp.NET MVCアプリケーションがあります。

管理者設定で、管理者グループを作成しました:

enter image description here

私のコードでは、[Authorize(Roles = "Administrator")]を使用します

通常のAzure Active Directoryでは、簡単に追加できました(わずか3行のコード)。しかし、Azure AD B2Cの場合、動作しているWebでチュートリアルや例を見つけることができません。たぶん、あなたは私が修正する必要があるものを私に伝えることができます。

これが私のStartup.Auth.csのConfigureAuthメソッドです

public void ConfigureAuth(IAppBuilder app)
{
    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

    app.UseCookieAuthentication(new CookieAuthenticationOptions());

    app.UseOpenIdConnectAuthentication(
        new OpenIdConnectAuthenticationOptions
        {
            // Generate the metadata address using the tenant and policy information
            MetadataAddress = String.Format(AadInstance, Tenant, DefaultPolicy),

            // These are standard OpenID Connect parameters, with values pulled from web.config
            ClientId = ClientId,
            RedirectUri = RedirectUri,
            PostLogoutRedirectUri = RedirectUri,

            // Specify the callbacks for each type of notifications
            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                RedirectToIdentityProvider = OnRedirectToIdentityProvider,
                AuthorizationCodeReceived = OnAuthorizationCodeReceived,
                AuthenticationFailed = OnAuthenticationFailed,
            },

            // Specify the claims to validate
            TokenValidationParameters = new TokenValidationParameters
            {
                NameClaimType = "name"
            },

            // Specify the scope by appending all of the scopes requested into one string (separated by a blank space)
            Scope = $"openid profile offline_access {ReadTasksScope} {WriteTasksScope}"
        }
    );
}
16
DarkWing89

Azure AD B2Cでは、アプリケーションに送信するトークンにグループクレームがまだ含まれていないため、Azure ADで概要を説明したのと同じアプローチに従うことはできません(トークンにグループクレームが含まれます)。

この機能は、Azure AD B2Cフィードバックフォーラムで投票することでサポートできます: Azure AD B2Cを使用したクレームのユーザーメンバーシップグループの取得

つまり、このアプリケーションで追加の作業を行うと、グループが要求するこれらの要求を手動で取得し、トークンに挿入することができます

まず、Microsoft Graphを呼び出してグループ要求を取得する別のアプリケーションを登録します

  1. https://apps.dev.Microsoft.com に移動します
  2. Application PermissionsDirectory.Read.Allでアプリを作成します。
  3. をクリックしてアプリケーションの秘密を追加します新しいパスワードを生成します
  4. プラットフォームを追加し、Webを選択してリダイレクトURIを指定します(例:https://yourtenant.onmicrosoft.com/groups
  5. 以下に移動して、このアプリケーションに同意します:https://login.microsoftonline.com/YOUR_TENANT.onmicrosoft.com/adminconsent?client_id=YOUR_CLIENT_ID&state=12345&redirect_uri=YOUR_REDIRECT_URI

次に、次のコードをOnAuthorizationCodeReceivedハンドラー内に追加する必要がありますコードを引き換えた直後

var authority = $"https://login.microsoftonline.com/{Tenant}";
var graphCca = new ConfidentialClientApplication(GraphClientId, authority, GraphRedirectUri, new ClientCredential(GraphClientSecret), userTokenCache, null);
string[] scopes = new string[] { "https://graph.Microsoft.com/.default" };

try
{
    AuthenticationResult authenticationResult = await graphCca.AcquireTokenForClientAsync(scopes);
    string token = authenticationResult.AccessToken;

    using (var client = new HttpClient())
    {
        string requestUrl = $"https://graph.Microsoft.com/v1.0/users/{signedInUserID}/memberOf?$select=displayName";

        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUrl);
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);

        HttpResponseMessage response = await client.SendAsync(request);
        var responseString = await response.Content.ReadAsStringAsync();

        var json = JObject.Parse(responseString);

        foreach (var group in json["value"])
            notification.AuthenticationTicket.Identity.AddClaim(new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Role, group["displayName"].ToString(), System.Security.Claims.ClaimValueTypes.String, "Graph"));

        //TODO: Handle paging. 
        // https://developer.Microsoft.com/en-us/graph/docs/concepts/paging
        // If the user is a member of more than 100 groups, 
        // you'll need to retrieve the next page of results.
    }
} catch (Exception ex)
{
    //TODO: Handle
    throw;
}
16
Saca