Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未指定authenticationScheme,并且找不到具有自定义基于策略的授权的DefaultBankeScheme_C#_Asp.net Core_Authorization_Asp.net Core 2.0 - Fatal编程技术网

C# 未指定authenticationScheme,并且找不到具有自定义基于策略的授权的DefaultBankeScheme

C# 未指定authenticationScheme,并且找不到具有自定义基于策略的授权的DefaultBankeScheme,c#,asp.net-core,authorization,asp.net-core-2.0,C#,Asp.net Core,Authorization,Asp.net Core 2.0,我有一个自定义的基于策略的授权处理程序,定义如下。身份验证是在用户点击此应用程序之前处理的,因此我只需要授权。我得到一个错误: 没有指定authenticationScheme,也没有DefaultForbidden方案 如果授权检查成功,那么我不会得到错误,一切正常。此错误仅在授权检查失败时发生。我希望在失败时会返回401 public class EasRequirement : IAuthorizationRequirement { public EasRequirement(st

我有一个自定义的基于策略的授权处理程序,定义如下。身份验证是在用户点击此应用程序之前处理的,因此我只需要授权。我得到一个错误:

没有指定authenticationScheme,也没有DefaultForbidden方案

如果授权检查成功,那么我不会得到错误,一切正常。此错误仅在授权检查失败时发生。我希望在失败时会返回401

public class EasRequirement : IAuthorizationRequirement
{
    public EasRequirement(string easBaseAddress, string applicationName, bool bypassAuthorization)
    {
        _client = GetConfiguredClient(easBaseAddress);
        _applicationName = applicationName;
        _bypassAuthorization = bypassAuthorization;
    }

    public async Task<bool> IsAuthorized(ActionContext actionContext)
    {
        ...
    }
}
公共类EAS要求:IAAuthorizationRequirement
{
公共EAS要求(字符串easBaseAddress、字符串applicationName、bool旁路授权)
{
_客户端=GetConfiguredClient(easBaseAddress);
_applicationName=applicationName;
_旁路授权=旁路授权;
}
公共异步任务已授权(ActionContext ActionContext)
{
...
}
}
公共类EasHandler:AuthorizationHandler
{
受保护的覆盖任务HandleRequirementAsync(授权HandlerContext上下文,EasRequirement)
{
var mvcContext=context.Resource作为ActionContext;
布尔被授权;
尝试
{
isAuthorized=需求。isAuthorized(mvcContext)。结果;
}
捕获(例外)
{
//TODO:记录错误?
未授权=错误;
}
如果(未授权)
{
成功(要求);
返回Task.CompletedTask;
}
context.Fail();
返回Task.FromResult(0);
}
}
公共类启动
{
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
//此方法由运行时调用。请使用此方法将服务添加到容器中。
public void配置服务(IServiceCollection服务)
{
var easBaseAddress=Configuration.GetSection(“easBaseAddress”).Value;
var applicationName=Configuration.GetSection(“applicationName”).Value;
var bypassAuthorization=bool.Parse(Configuration.GetSection(“BypassEasAuthorization”).Value);
var policy=new AuthorizationPolicyBuilder()
.AddRequirements(新的easRequirements(easBaseAddress、应用程序名称、授权))
.Build();
services.AddAuthorization(选项=>
{
选项。添加策略(“EAS”,策略);
});
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddSingleton();
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
其他的
{
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseMvc();
}
}

授权和身份验证在ASP.NET核心中紧密相连。当授权失败时,这将传递给身份验证处理程序以处理授权失败

public class EasRequirement : IAuthorizationRequirement
{
    public EasRequirement(string easBaseAddress, string applicationName, bool bypassAuthorization)
    {
        _client = GetConfiguredClient(easBaseAddress);
        _applicationName = applicationName;
        _bypassAuthorization = bypassAuthorization;
    }

    public async Task<bool> IsAuthorized(ActionContext actionContext)
    {
        ...
    }
}
因此,即使您不需要实际的身份验证来识别您的用户,您仍然需要设置一些能够处理禁止和质询结果的身份验证方案(403和401)

为此,您需要调用
AddAuthentication()
并配置默认的禁止/质询方案:

services.AddAuthentication(options =>
{
    options.DefaultChallengeScheme = "scheme name";

    // you can also skip this to make the challenge scheme handle the forbid as well
    options.DefaultForbidScheme = "scheme name";

    // of course you also need to register that scheme, e.g. using
    options.AddScheme<MySchemeHandler>("scheme name", "scheme display name");
});

对于IIS/IIS Express,只需在接受的答案中添加这一行而不是以上所有内容,即可获得您期望的相应403响应

 services.AddAuthentication(IISDefaults.AuthenticationScheme);

有没有办法防止您描述的默认行为?“当授权失败时,这将传递给身份验证处理程序以处理授权失败”@ChristophAdamakis No,这就是身份验证和授权的链接方式。当授权失败时,身份验证方案必须处理该失败你想在那里做什么?一定发生了什么。@ajamrozek在浏览器弹出窗口中请求您登录时发出凭证提示?或者只是重定向到某个登录表单?前者不应该是可能的,后者通过拥有自己的身份验证方案而被明确阻止。也许你应该提出一个新问题,包括你到底在做什么。请随意在这里贴一个问题的链接,我来看看,“不可能”。接受质疑;)原来我在launchsettings.json中启用了WindowsAuth。把它拿出来,再也没有提示了。否则,这个答案对我的指导非常好。如果有人想知道“做点什么”应该是什么样子,请参阅
public class MySchemeHandler : IAuthenticationHandler
{
    private HttpContext _context;

    public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context)
    {
        _context = context;
        return Task.CompletedTask;
    }

    public Task<AuthenticateResult> AuthenticateAsync()
        => Task.FromResult(AuthenticateResult.NoResult());

    public Task ChallengeAsync(AuthenticationProperties properties)
    {
        // do something
    }

    public Task ForbidAsync(AuthenticationProperties properties)
    {
        // do something
    }
}
 services.AddAuthentication(IISDefaults.AuthenticationScheme);