ASP.Net core 2.0 Web API 中的 Cookie 身份验证

Ana*_*and 3 c# asp.net-web-api asp.net-core

我正在尝试在 ASP.Net Core 2.0 Web API 中使用基于 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();
        });
//...
}
Run Code Online (Sandbox Code Playgroud)

然后 ...

app.UseAuthentication()
Run Code Online (Sandbox Code Playgroud)

Pac*_*ace 5

尝试添加:

services.AddAuthorization(options =>
{
    options.DefaultPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
});
Run Code Online (Sandbox Code Playgroud)

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));
});
Run Code Online (Sandbox Code Playgroud)

AddMvcCore默认不添加授权服务。你还需要做AddMvcCore(...).AddAuthorization()

  • 我没有意识到`AddMvcCore` 默认不添加授权服务。您将需要执行`AddMvcCore(...).AddAuthorization()`。 (4认同)