#asp.net-mvc #azure-active-directory #openid-connect
#asp.net-mvc #azure-active-directory #OpenID-подключение
Вопрос:
у нас есть веб-приложение, которое использует OIDC для единого входа для аутентификации в Azure AD. Единый вход работает отлично, пользователи могут входить в систему со своих учетных записей AD. Возвращаемый токен также содержит группы AD. Я хотел бы разрешить моим контроллерам MVC разрешать только определенным группам использовать определенные контроллеры.
Как мне это реализовать? Я вижу, что группы отправляются обратно в токене, представленном в виде идентификаторов GUID. Я пробовал устанавливать требования к роли через RoleClaimType = "roles",
, но это не работает.
вот мой код.
public void ConfigureAuth(IAppBuilder app)
{
FATContext db = new FATContext();
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies",
CookieManager = new Microsoft.Owin.Host.SystemWeb.SystemWebChunkingCookieManager(),
});
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = Authority,
PostLogoutRedirectUri = postLogoutRedirectUri,
TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
// Set claimsPrincipal's roles to the roles claim
RoleClaimType = "roles",
},
Notifications = new OpenIdConnectAuthenticationNotifications()
{
RedirectToIdentityProvider = (context) =>
{
context.ProtocolMessage.RedirectUri = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path);
context.ProtocolMessage.PostLogoutRedirectUri = new UrlHelper(HttpContext.Current.Request.RequestContext).Action("Index", "Home", null, HttpContext.Current.Request.Url.Scheme);
return Task.FromResult(0);
},
// If there is a code in the OpenID Connect response, redeem it for an access token and refresh token, and store those away.
AuthorizationCodeReceived = (context) =>
{
var code = context.Code;
ClientCredential credential = new ClientCredential(clientId, appKey);
string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;
AuthenticationContext authContext = new AuthenticationContext(Authority, new ADALTokenCache(signedInUserID));
return authContext.AcquireTokenByAuthorizationCodeAsync(
code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential, graphResourceId);
}
}
});
}
Так, например, как я могу заставить это работать с моим контроллером, например
[AuthorizeUser(Roles = "xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
public ActionResult Index()
{
return View();
}
или проверить, находится ли пользователь в определенной роли, т.е. User.IsInRole("example ")
Ответ №1:
В Azure AD мы можем определять роли приложений и назначать роли группам. Теперь у пользователей этой группы будет заявка с определенными ролями (пример, как показано ниже). Обратитесь к этой ссылке для получения подробной документации о том, как создавать / управлять ролями для приложения в Azure AD.
{
"roles": ["admin"]
}
Если вы просто пытаетесь использовать авторизацию на основе групп, вы можете использовать RoleClaimType = «groups» и приведенные ниже примеры кодов в контроллере или в методах действий. Для получения более подробной информации у вас есть аналогичная информация здесь
[Authorize(Roles = "Admin")]
public class TestAdminAccessController : ApiController
{
public ActionResult Index()
{
if (this.User.Identity.IsAuthenticated)
{
if (User.IsInRole("Admin"))
{
// Your logic
}
else
{
// is NOT an admin. No permissions
}
}
else
{
// is NOT Authenticated;
}
}
}