programing

Azure AD B2C - 역할 관리

showcode 2023. 5. 25. 22:15
반응형

Azure AD B2C - 역할 관리

Azure AD B2C에 연결된 ASP.NET MVC 애플리케이션을 가지고 있습니다.

관리자 설정에서 관리자 그룹을 만들었습니다.

여기에 이미지 설명 입력

내 코드에서 사용하고 싶습니다.[Authorize(Roles = "Administrator")]

일반적인 Azure Active Directory를 사용하면 쉽게 추가할 수 있습니다(코드 3줄만).그러나 Azure AD B2C의 경우 웹에서 작동하는 튜토리얼이나 예제를 찾을 수 없습니다.제가 무엇을 수정해야 하는지 알려주실 수 있을 것 같습니다.

다음은 구성입니다.내 시작의 인증 방법입니다.Auth.cs

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}"
        }
    );
}

Azure AD B2C는 애플리케이션으로 전송되는 토큰에 그룹 클레임을 아직 포함하지 않으므로 Azure AD에서 개요를 설명한 것과 동일한 접근 방식을 따를 수 없습니다(토큰에 그룹 클레임 포함).

Azure AD B2C 피드백 포럼에서 투표를 통해 이 기능 질문을 지원할 수 있습니다.Azure AD B2C를 사용하여 클레임의 사용자 멤버십 그룹 가져오기

즉, 이 애플리케이션에서 추가 작업을 수행하여 그룹이 주장하는 이러한 클레임을 수동으로 검색하여 토큰에 주입할 수 있습니다.

먼저 Microsoft Graph를 호출하여 그룹 클레임을 검색하는 별도의 응용 프로그램을 등록합니다.

  1. https://apps.dev.microsoft.com 으로 이동합니다.
  2. 응용 프로그램 권한: 디렉터리사용하여 앱을 만듭니다.읽으세요.
  3. 암호 생성을 클릭하여 응용 프로그램 암호 추가
  4. 플랫폼을 추가하고 웹을 선택한 후 리디렉션 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

그런 다음 코드를 사용한 후 바로 핸들러 내부에 다음 코드를 추가해야 합니다.

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;
}

언급URL : https://stackoverflow.com/questions/45885795/azure-ad-b2c-role-management

반응형