C# ASP.NETCore2.0WebAPI中的Cookie身份验证

C# ASP.NETCore2.0WebAPI中的Cookie身份验证,c#,asp.net-web-api,asp.net-core,C#,Asp.net Web Api,Asp.net Core,我正在尝试在ASP.NETCore2.0WebAPI中使用基于cookie的身份验证,并尝试使用以下代码激活该身份验证。登录页面托管在与应用托管域不同的域中。我已经向控制器添加了[Authorize]属性 在启动时,我可以看到在调试器中调用的服务代码 我的期望是,当我的web客户端使用web api服务时,中间件将检测到标头没有cookie,并将客户端重定向到登录页面。然而,我能够自由地调用控制器 public void ConfigureServices(IServiceCollect

我正在尝试在ASP.NETCore2.0WebAPI中使用基于cookie的身份验证,并尝试使用以下代码激活该身份验证。登录页面托管在与应用托管域不同的域中。我已经向控制器添加了
[Authorize]
属性

在启动时,我可以看到在调试器中调用的服务代码

我的期望是,当我的web客户端使用web api服务时,中间件将检测到标头没有cookie,并将客户端重定向到登录页面。然而,我能够自由地调用控制器

    public void ConfigureServices(IServiceCollection services)
    {
            services.AddCors(options => options.AddPolicy("AllowAll",
            builder => builder.SetIsOriginAllowed(s => true)
                .AllowAnyHeader()
                .AllowAnyMethod()
                .AllowCredentials()));

        services.TryAddTransient<CorsAuthorizationFilter, CorsAuthorizationFilter>();

        services.AddSwaggerGen(c =>
        {
            c.OperationFilter<FileOperationFilter>();
            c.SwaggerDoc("v1", new Info
            {
                Title = "Collateral Management API",
                Version = "v1"
            });
        });

        services.AddMvcCore(options =>
            {

                options.Filters.Add(new CorsAuthorizationFilterFactory("AllowAll"));
                var policy = new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .Build();
                options.Filters.Add(new AuthorizeFilter(policy));
            })
            .AddApiExplorer()
            .AddJsonFormatters(s => s.NullValueHandling = NullValueHandling.Ignore);

        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie(auth =>
            {
                auth.Cookie.Domain = "xxx.com";
                auth.Cookie.Name = "xxx";
                auth.LoginPath = "/signin";
                auth.AccessDeniedPath = "/signin";
            });

        services.AddAuthorization(auth =>
        {
            auth.DefaultPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
        });
//...
}
尝试添加:

services.AddAuthorization(options =>
{
    options.DefaultPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
});
services.AddMvc()之后

编辑

考虑到添加MVC的方式,您可以尝试:

// requires: using Microsoft.AspNetCore.Authorization;
//           using Microsoft.AspNetCore.Mvc.Authorization;
services.AddMvcCore(config =>
{
    var policy = new AuthorizationPolicyBuilder()
                     .RequireAuthenticatedUser()
                     .Build();
    config.Filters.Add(new AuthorizeFilter(policy));
});

AddMvcCore
默认情况下不添加授权服务。您还需要执行AddMvcCore(…)。AddAuthorization()

您配置了授权吗?除非调用被链中稍后的授权中间件拒绝,否则将不使用
LoginPath
。请确保app.UseMvc之前有app.UseAuthentication。如果在本地主机上进行测试,则省略域名。还可以尝试使cookie名称与身份验证名称相同scheme@Pace您能详细说明一下配置授权的含义吗?在您的评论之后,我还尝试了
[授权(AuthenticationSchemes=CookieAuthenticationDefaults.AuthenticationScheme)]
但我在回答中详细说明了这一点,但这并没有起作用,因为这有点像一个评论。问题解决了吗?如果没有,您可以添加中间件的代码吗?控制器代码呢?您是否在控制器构造函数中使用IHttpContextAccessor访问cookie?如果没有,您需要添加它。已尝试但不起作用。我使用
services.AddMvcCore(options=>options.Filters.Add(新的CorsAuthorizationFilterFactory(“AllowAll”))).AddApiExplorer().AddJsonFormatters(s=>s.NullValueHandling=NullValueHandling.Ignore)向tryI添加了其他内容调用api时,我现在遇到异常
没有注册类型为“Microsoft.AspNetCore.Authorization.Policy.IPolicyEvaluator”的服务。
我编辑了我的问题,在
配置服务中提供了完整的相关代码
我真的很感激您继续提供我没有意识到的服务默认情况下,
AddMvcCore
不会添加授权服务。您需要执行
AddMvcCore(…)。AddAuthorization()
AddMvcCore(…)。AddAuthorization()
是在
AddMvcCore
builder方法中配置策略所需的,而不是
AddAuthorization
// requires: using Microsoft.AspNetCore.Authorization;
//           using Microsoft.AspNetCore.Mvc.Authorization;
services.AddMvcCore(config =>
{
    var policy = new AuthorizationPolicyBuilder()
                     .RequireAuthenticatedUser()
                     .Build();
    config.Filters.Add(new AuthorizeFilter(policy));
});