我有一个Asp.net MVC应用程序,我在其中使用Azure AD身份验证来验证用户。我想允许用户无需登录即可访问某些api控制器。我尝试在控制器之上放置[AllowAnonymous]属性以从身份验证中跳过这些控制器,但是它总是重定向到Microsoft登录页面以获取凭据。来自Startup.cs的代码片段:
public void ConfigureAuth(IAppBuilder app)
{
string clientId = GetConfigValue("ida_ClientId");
string aadInstance = GetConfigValue("ida_AADInstance");
string tenant = GetConfigValue("ida_Tenant");
string domain = GetConfigValue("ida_Domain");
string authority = GetConfigValue("ida_Authority");
string postLogoutRedirectUri = GetConfigValue("ida_RedirectUri");
bool devEnvironment = Convert.ToBoolean(GetConfigValue("DevEnvironment"));
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
CookieHttpOnly = true,
CookieSecure = devEnvironment ? CookieSecureOption.SameAsRequest : CookieSecureOption.Always,
});
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = authority,
PostLogoutRedirectUri = postLogoutRedirectUri,
RedirectUri = postLogoutRedirectUri,
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthenticationFailed = context =>
{
context.HandleResponse();
context.Response.Redirect("/Error?message=" + context.Exception.Message);
return Task.FromResult(0);
}
}
});
}
private string GetConfigValue(string key)
{
if (RoleEnvironment.IsAvailable)
{
return RoleEnvironment.GetConfigurationSettingValue(key);
}
else
{
return ConfigurationManager.AppSettings[key];
}
}
}
如果我遗漏了什么,请告诉我。提前致谢
答案 0 :(得分:1)
这是预期的行为。 Easy Auth是作为本机IIS模块实现的,它与您的应用程序在同一个沙箱中运行。启用后,调度到IIS工作进程的每个HTTP请求必须首先通过此模块,然后才能对应用程序代码做出反应。
除非经过身份验证,否则将会将请求分派到Web应用程序,并且 AllowAnonymous 在此方案中不起作用。如果要允许匿名请求,可以使用OWIN组件而不是使用Easy Auth来实现身份验证。
这是一个使用OpenId组件保护MVC的示例:
active-directory-dotnet-webapp-openidconnect
关于Easy Auth的更多细节,您可以参考CGillum的博客
Architecture of Azure App Service Authentication / Authorization
答案 1 :(得分:0)
在我看来,任何页面上都允许匿名,除非应用了以下四个设置之一:
在Startup.Auth类的ConfigureAuth方法的底部:
// This makes any middle-ware defined above this line run before the Authorization rule is applied in web.config
app.UseStageMarker(PipelineStage.Authenticate);
控制器类/方法上的属性:
[Authorize]
public class HomeController : Controller
App_Start全局过滤器:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new AuthorizeAttribute());
}
}
在Web.config的system.web部分中
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
因此,您基本上必须反过来考虑,删除所有全局设置,然后要求对视图进行身份验证以进行限制。