我正在尝试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));
});
我是否遗漏了授权属性或发出质询的政策的一些设置?
答案 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;
});