将Authorize属性与Azure Active Directory一起使用

时间:2015-12-03 22:12:32

标签: c# azure authorization owin azure-active-directory

我尝试使用[授权(角色="测试")]和/或在测试应用上调用User.IsInRole(" test")并且&# 39;不适合我。在Azure管理门户中的应用程序配置中,我已在应用程序清单中启用了SecurityGroup声明,并且还设置了委派权限以允许"读取所有组"和"读取目录数据"。执行此操作后,我能够在(ClaimsPrincipal.Current.Identity作为ClaimsIdentity).FindAll(" groups")中看到测试组的SID,但Authorize属性和对IsInRole的调用不是工作。还有其他必要的东西可以让它发挥作用吗?

2 个答案:

答案 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();
    }