我尝试使用[授权(角色="测试")]和/或在测试应用上调用User.IsInRole(" test")并且&# 39;不适合我。在Azure管理门户中的应用程序配置中,我已在应用程序清单中启用了SecurityGroup声明,并且还设置了委派权限以允许"读取所有组"和"读取目录数据"。执行此操作后,我能够在(ClaimsPrincipal.Current.Identity作为ClaimsIdentity).FindAll(" groups")中看到测试组的SID,但Authorize属性和对IsInRole的调用不是工作。还有其他必要的东西可以让它发挥作用吗?
答案 0 :(得分:4)
Azure AD不会在Role声明中发送组,并且它不会发送组的名称(在多租户系统中,这并不意味着太多:contoso中的“admin”可能与“admin”具有完全不同的语义在fabrikam)。 Azure AD有一个新结构,表示实际角色,而不是组。如果要根据角色的名称检查访问权限,请参阅https://github.com/Azure-Samples/active-directory-dotnet-webapp-roleclaims/blob/master/WebApp-RoleClaims-DotNet以获取使用应用程序角色的示例。 如果您想要检查组的授权,则需要将组声明类型指定为RoleClaimType(在https://github.com/Azure-Samples/active-directory-dotnet-webapp-roleclaims/blob/master/WebApp-RoleClaims-DotNet/App_Start/Startup.Auth.cs中,您可以看到它是如何为app角色完成的),以便ASP.NET知道它是要验证的声明当Authorize和IsInRole发挥作用时。另外,如果您没有获得组名,则需要对组的objectId执行检查。如果要使用组并检查组名,则会变得复杂。您需要调用图API来将组的ObjectId转换为其名称,并相应地扩充传入的声明集合。
答案 1 :(得分:1)
在ASP.NET 5和MVC 6中,您需要做的就是正确配置。这段代码对我来说就像一个魅力:
public void ConfigureApplication(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
...
app.UseIISPlatformHandler();
app.UseStaticFiles();
app.UseCookieAuthentication(options =>
{
options.AutomaticAuthenticate = true;
});
app.UseOpenIdConnectAuthentication(options =>
{
options.AutomaticChallenge = true;
options.ClientId = Configuration.Get<string>("Authentication:AzureAd:ClientId");
options.Authority = Configuration.Get<string>("Authentication:AzureAd:AADInstance") + "Common";
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
RoleClaimType = "roles"
};
options.Events = new OpenIdConnectEvents
{
OnAuthenticationValidated = (context) => Task.FromResult(0),
OnAuthenticationFailed = (context) =>
{
context.Response.Redirect("/Home/Error");
context.HandleResponse(); // Suppress the exception
return Task.FromResult(0);
},
OnRemoteError = (context) => Task.FromResult(0)
};
});
app.UseMvc(routes =>
{
routes.MapRoute(name: "default", template: "{controller=Dashboard}/{action=Index}/{id?}");
});
DatabaseInitializer.InitializaDatabaseAsync(app.ApplicationServices).Wait();
}