Невозможно получить роль от вошедшего в систему пользователя Azure AD B2C
Я пытаюсь использовать следующее, чтобы определить, является ли зарегистрированный пользователь Azure AD B2C администратором:
if (User.IsInRole("Administrator"))
{
.... Display special info for Admins ....
}
Тем не менее, когда я смотрю в System.Security.Principal.IPrincipal.User
объект, я вижу null
для списка ролей, которые имеет этот пользователь:
Ниже приведен соответствующий код, который настраивает аутентификацию и запросы. TokenValidationParameters
В том числе и для ролей, подлежащих валидации. Я пробовал следующее: RoleClaimType = "role"
а также RoleClaimType = "roles"
, оба из которых не сработали для меня.
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseKentorOwinCookieSaver();
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
CookieSecure = CookieSecureOption.Always
});
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,
Authority = Authority,
PostLogoutRedirectUri = RedirectUri,
RedirectUri = RedirectUri,
Notifications = new OpenIdConnectAuthenticationNotifications()
{
RedirectToIdentityProvider = OnRedirectToIdentityProvider,
AuthenticationFailed = OnAuthenticationFailed,
AuthorizationCodeReceived = OnAuthorizationCodeReceived
},
/////////// HERE //////////
// Specify the claims to validate
TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name",
RoleClaimType = "role",
},
// Specify the scope by appending all of the scopes requested into one string (seperated by a blank space)
Scope = $"{OpenIdConnectScopes.OpenId} {ReadTasksScope} {WriteTasksScope}"
}
);
}
Тем не менее, когда я декодирую id_token
извлеченный из процесса аутентификации и декодирующий его с помощью инструмента https://jwt.ms/, я не вижу претензии "ролей", как показано на скриншоте.
Кроме того, в политике SignIn Azure AD B2C, возможно, мне нужно добавить ClaimType для "ролей"?
Пожалуйста помоги! Что еще мне нужно сделать, чтобы получить User.IsInRole("Administrator")
работать? Спасибо!
1 ответ
Чтобы решить эту проблему, я использовал клиент Azure AD Graph для запроса всех ролей каталога, принадлежащих пользователю с указанным objectId
, Вот метод, который я добавил:
public async Task<string> GetUserRoleByObjectId(string objectId)
{
return await SendGraphGetRequest("/users/" + objectId + "/$links/memberOf", null);
}
Я добавил этот метод в B2CGraphClient.cs
файл в следующем примере кода, который я интегрировал в свое веб-приложение: https://github.com/AzureADQuickStarts/B2C-GraphAPI-DotNet