【问题标题】:How do I return a 401 status instead of a 302 redirect after cookie has expired?cookie 过期后如何返回 401 状态而不是 302 重定向?
【发布时间】:2018-04-24 23:28:01
【问题描述】:

我正在使用不带身份的 cookie 身份验证和以下 Nuget 包:

<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.WsFederation" Version="2.0.3" />

我在我的 cookie 上设置了一个短暂的超时,并希望我的 API 调用在 cookie 过期时返回 401 状态而不是 302 重定向。我的ConfigureServices 如下所示:

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IRestService, RestService>();

    services.AddDataProtection()
        .SetApplicationName("AspNetCookieShare")
        .PersistKeysToFileSystem(new DirectoryInfo(Configuration["DataProtectionKeyDirectory"]));

    services.AddAuthentication(sharedOptions =>
        {
            sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
        })
        .AddWsFederation(options =>
        {
            options.Wtrealm = Configuration["Wtrealm"];
            options.MetadataAddress = "http://example.com/metadata.xml";
            options.SkipUnrecognizedRequests = true;
            options.RequireHttpsMetadata = false;
            options.UseTokenLifetime = false;
        })
        .AddCookie(options =>
        {
            options.ExpireTimeSpan = TimeSpan.FromSeconds(10);
            options.Cookie.Expiration = TimeSpan.FromSeconds(10);
            options.Cookie.Name = "AspNetShared";
            options.Cookie.Path = "/";

            options.Events.OnRedirectToLogin = context =>
            {
                context.Response.StatusCode = 401;
                return Task.CompletedTask;
            };
        });

    services.AddMvc();
}

我正在使用 OnRedirectToLogin,但是,在 cookie 过期后,我仍然收到 302 响应,而不是 401:

我做错了什么?

【问题讨论】:

  • 因为 WsFed 是您的默认挑战方案,我认为这就是您需要拦截重定向的地方。我没有以这种方式设置身份验证,但基本上我认为 cookie 部分正在跟踪登录,但 WsFed 实际上控制它。
  • @McGuireV10 谢谢。你为我指明了正确的方向。
  • Cookie Auth 和 WsFed 不太适合 WebAPI,请改用 JwtBearer。

标签: c# asp.net-core asp.net-core-mvc asp.net-core-2.0 ws-federation


【解决方案1】:

我将services.AddWsFederation() 更改为以下内容,它似乎可以正常工作:

.AddWsFederation(options =>
{
    options.Wtrealm = Configuration["Wtrealm"];
    options.MetadataAddress = "http://example.com/metadata.xml";
    options.SkipUnrecognizedRequests = true;
    options.RequireHttpsMetadata = false;
    options.UseTokenLifetime = false;
    options.Events.OnRedirectToIdentityProvider = context =>
    {
        context.Response.StatusCode = 401;
        context.HandleResponse();
        return Task.CompletedTask;
    };
})

【讨论】:

  • 应该放在哪个文件上?
  • @Gregory 在Startup.csConfigureServices()。虽然我有一段时间没有使用它所以我不确定它是否仍然有效。
猜你喜欢
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 2019-03-23
  • 1970-01-01
相关资源
最近更新 更多