如何使[Authorize]触发openId中间件

时间:2015-12-28 12:50:16

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

我正在尝试ASP.NET 5的一些功能,我在认证方面有点苦苦挣扎。我已经设法使用大多数this示例应用程序连接到我的Azure AD以登录,但我无法弄清楚如何将我的Web应用程序的部分限制为仅经过身份验证的用户。我使用的示例应用程序附带的文章指出

  

您可以触发中间件发送OpenID Connect登录   通过[授权]装饰类或方法的请求   属性,或通过发出挑战

由于我想避免在任何地方重复相同的挑战代码,我选择了属性方法,但它根本不起作用。它似乎只是阻止访问未经授权的用户,而不像挑战那样重定向到登录页面。

由于我打算将我构建的应用程序设置为比公共更私密,我还尝试使用AllowAnonymous属性创建全局策略并打开一些选择功能。这样做有效,但未经授权的页面再次显示为空白,而不是发出挑战。

这是我目前使用的政策代码,取自here

var policy = new AuthorizationPolicyBuilder()
            //This is what makes it function like the basic [Authorize] attribute
            .RequireAuthenticatedUser()
            .Build();

            services.Configure<MvcOptions>(options =>
            {
                options.Filters.Add(new AuthorizeFilter(policy));
            });

我是否遗漏了授权属性或发出质询的政策的一些设置?

1 个答案:

答案 0 :(得分:1)

对于后代而且很可能是我未来的自我:

我在OpenIdConnectOptions中缺少AutomaticAuthentication属性。示例应用程序设置如下:

            // Configure the OWIN Pipeline to use Cookie Authentication
            app.UseCookieAuthentication(options => 
            {
                // By default, all middleware are passive/not automatic. Making cookie middleware automatic so that it acts on all the messages.
                options.AutomaticAuthentication = true;

            });

            // Configure the OWIN Pipeline to use OpenId Connect Authentication
            app.UseOpenIdConnectAuthentication(options =>
            {
                options.ClientId = Configuration.Get("AzureAd:ClientId");
                options.Authority = String.Format(Configuration.Get("AzureAd:AadInstance"), Configuration.Get("AzureAd:Tenant"));
                options.PostLogoutRedirectUri = Configuration.Get("AzureAd:PostLogoutRedirectUri");
                options.Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    AuthenticationFailed = OnAuthenticationFailed,
                };
            });

为了让一切顺利,我必须进行小的调整才能使它看起来像这样:

            app.UseCookieAuthentication(options => { options.AutomaticAuthentication = true; });
            // Configure the OWIN Pipeline to use OpenId Connect Authentication
            app.UseOpenIdConnectAuthentication(options =>
            {
                options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.ClientId = Configuration.Get("AzureAd:ClientId");
                options.Authority = String.Format(Configuration.Get("AzureAd:AadInstance"), Configuration.Get("AzureAd:Tenant"));
                options.PostLogoutRedirectUri = Configuration.Get("AzureAd:PostLogoutRedirectUri");
                options.Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    AuthenticationFailed = OnAuthenticationFailed,
                };
                options.AutomaticAuthentication = true;
            });