.Net Core使用Azure AD授权经过身份验证的用户

时间:2018-09-24 16:16:34

标签: azure-active-directory asp.net-core-2.0

嗨,

我们有一个具有Azure AD身份验证的.Net Core 2.0应用。 目前,我们有一些与该应用程序关联的用户已在Azure AD中获得了该应用程序的角色,并且正在使用策略来检查授权。由于业务需求,我们希望向公司中的任何用户打开该应用程序,因此我们只需要检查该用户是否已通过身份验证即可。

作为一名经验丰富的C#开发人员,我去了具有以下代码的控制器


[Authorize(Policy = PolicyNames.RequireLinecardsUser)]
        public class LinecardController : Controller
        {
            //controller code here
        }
并将其更改为此

    [Authorize]
        public class LinecardController : Controller
        {
            //controller code here
        }
对于可能仍然具有LinecardUser角色的用户来说,它可以工作。它可以访问该应用程序(主入口位于该控制器内部)。但是,当我们与在应用程序中没有角色的用户进行测试时,它会获得拒绝访问的异常。

因此,下一步我们开始启动,并删除了授权配置(它只有2个现在未使用的策略)。


    public void ConfigureServices(IServiceCollection services)
            {
                try
                {
                    services.AddDbContext(options =>
                    {
                        options.UseSqlServer(Configuration.GetConnectionString("LinecardsContext"), opt => opt.UseRowNumberForPaging());
                    });
                    services.AddAuthentication(options =>
                        {
                            options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                            options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                            options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
                            options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                            options.DefaultForbidScheme = OpenIdConnectDefaults.AuthenticationScheme;
                        })
                        .AddCookie(options =>
                        {
                            options.AccessDeniedPath = "/Account/AccessDenied/";
                            options.LoginPath = "/Account/Login/";
                        })
                        .AddOpenIdConnect(options =>
                        {
                            configuration.GetSection("AzureAd").Bind(options);
                        });

                   services.AddAuthorization(options =>
                        {
                            options.AddPolicy(PolicyNames.RequireLinecardsUser,
                                      policy =>
                                      {
                                              policy.AddRequirements(new LinecardsWebUserRequirement()); 
                                              policy.RequireAuthenticatedUser(); // Adds DenyAnonymousAuthorizationRequirement 
                                                                                 // By adding the CookieAuthenticationDefaults.AuthenticationScheme, if an authenticated
                                                                                 // user is not in the appropriate role, they will be redirected to a "forbidden" page.
                                              policy.AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme);
                                      });

                            options.AddPolicy(PolicyNames.RequireLinecardsAdmin,
                                        policy =>
                                        {
                                            policy.AddRequirements(new LinecardsWebAdminRequirement());
                                            policy.RequireAuthenticatedUser(); // Adds DenyAnonymousAuthorizationRequirement 
                                                                               // By adding the CookieAuthenticationDefaults.AuthenticationScheme, if an authenticated
                                                                               // user is not in the appropriate role, they will be redirected to a "forbidden" page.
                                                policy.AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme);
                                        });
                        });

                    services.AddScoped();

                    services.RegisterTypes();

                    services.AddReact();

                    services.AddAutoMapper();

                    services.Configure(x => x.ValueCountLimit = 100000);
                    services.AddMvc();
                }
                catch (Exception ex)
                {
                    Log.Error(ex, "Error happened on configuring services");
                    throw;
                }
            }
这意味着在前面的代码中,我们删除了services.AddAuthentication();。块。结果相同,具有角色的用户可以访问该应用程序,而没有角色的用户则可以访问该应用程序。 (也尝试以匿名方式在浏览器中使用,以确保此处没有发生缓存问题)。

最后,我们尝试更改RequireLinecardsUser策略,因此它没有该策略。AddRequirements(new LinecardsWebUserRequirement());行(并将控制器更改为带有策略的原始授权行。 再次,相同的结果对我来说很好,对于没有角色的用户,访问被拒绝。

我是否缺少明显的东西? Core 2.0发生了什么变化?与Azure相关吗? 因为我发现的每个文档都说[Authorize]批注不带任何参数,应该可以正常工作并且可以使用,并且仅允许用户进行身份验证,然后再继续执行代码...

你们中有些人可能已经注意到,该应用程序具有我从未接触过的响应前端,请随时指出可能与此相关的任何问题。

PPS:对不起,如果格式不符合标准,但这是我的第一个问题

1 个答案:

答案 0 :(得分:0)

在对该应用程序进行了更多测试之后,一个异常指出了Azure是此问题的罪魁祸首。 在Azure中的应用程序属性上,有一个选项询问“是否需要用户分配?”。该应用程序的特定设置被设置为“是”。 将其更改为no即可解决问题。