是否可以"禁用"在不改变逻辑的情况下在asp.net核心应用程序中进行身份验证?
我有一个.net网站,它使用外部身份服务器应用程序进行身份验证。 无论如何,我希望能够在我开发它时模拟身份验证(ASPNETCORE_ENVIRONMENT =开发),通过访问忽略授权属性的所有操作。
是否可以仅仅模拟服务集合中的某些服务?
答案 0 :(得分:21)
在更新到Net Core 3.1时,mvc AllowAnonymousFilter
不再对我们有用。我们发现有条件地添加自定义IAuthorizationHander
是有条件地绕过身份验证的最简单方法。
例如
/// <summary>
/// This authorisation handler will bypass all requirements
/// </summary>
public class AllowAnonymous : IAuthorizationHandler
{
public Task HandleAsync(AuthorizationHandlerContext context)
{
foreach (IAuthorizationRequirement requirement in context.PendingRequirements.ToList())
context.Succeed(requirement); //Simply pass all requirements
return Task.CompletedTask;
}
}
然后有条件地在Startup.ConfigureServices
中注册此处理程序。
private readonly IWebHostEnvironment _env;
public Startup(IWebHostEnvironment env)
{
_env = env;
}
public void ConfigureServices(IServiceCollection services)
{
{...}
//Allows auth to be bypassed
if (_env.IsDevelopment())
services.AddSingleton<IAuthorizationHandler, AllowAnonymous>();
}
注意AddAuthentication
和AddAuthorization
服务仍按照产品代码注册和配置(很好)。
为了允许我们的单元测试绕过auth,我们添加了一个带有启动类的新匿名测试库,该类在没有任何条件的情况下添加了该行。很好,很简单!
答案 1 :(得分:10)
我在illucIT Blog找到了解决此问题的方法。
此代码必须有效:
if (env.IsDevelopment()) {
services.AddMvc(opts =>
{
opts.Filters.Add(new AllowAnonymousFilter());
});
} else {
services.AddMvc();
}
答案 2 :(得分:5)
在没有更多详细信息的情况下给出详细答案很棘手,但我之前通过有条件注册来实现这一目标:
//this is where I dont get a response on click
if(bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED ){
CloseSheet.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
}
else if(event.getAction() == MotionEvent.ACTION_UP){
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
}
else if(event.getAction() == MotionEvent.ACTION_CANCEL){
}
return true;
}
});
}
就我而言,授权过滤器是全局应用的,因此MVC应用程序的每个操作都需要经过身份验证的用户。
如果您有不同的要求 - 某些操作的细粒度public class Startup
{
public Startup(IHostingEnvironment env)
{
Environment = env;
}
public IHostingEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(x =>
{
if (!Environment.IsDevelopment())
{
var authenticatedUserPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
x.Filters.Add(new AuthorizeFilter(authenticatedUserPolicy));
}
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseStaticFiles();
if (!Environment.IsDevelopment())
{
// Register external authentication middleware
}
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
属性 - 那么您可以通过更改相关授权策略的构建方式来实现相同的结果。它们基本上根本不包含任何要求。
[Authorize]
答案 3 :(得分:4)
在ASP.NET Core 3.x和更高版本中,可以如下所示更改Startup.Configure()
方法,以便将AllowAnonymousAttribute
添加到控制器中:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ...
app.UseEndpoints(endpoints =>
{
if (env.IsDevelopment())
endpoints.MapControllers().WithMetadata(new AllowAnonymousAttribute());
else
endpoints.MapControllers();
});
}
请注意,这会将AllowAnonymousAttribute
添加到所有控制器。 AllowAnonymousAttribute
在文档中的描述:
指定此属性应用于的类或方法不需要授权。