嗨,
我们有一个具有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:对不起,如果格式不符合标准,但这是我的第一个问题
答案 0 :(得分:0)
在对该应用程序进行了更多测试之后,一个异常指出了Azure是此问题的罪魁祸首。 在Azure中的应用程序属性上,有一个选项询问“是否需要用户分配?”。该应用程序的特定设置被设置为“是”。 将其更改为no即可解决问题。