10

我们正在构建一个使用基本身份验证的 ServiceStack API。我目前在我的 AppHost 中设置了身份验证,如下所示:

var authDb = new OrmLiteConnectionFactory("Server=(...);", true, MySqlDialectProvider.Instance);

var authRepo = new OrmLiteAuthRepository(authDb);
authRepo.CreateMissingTables();
container.Register<ICacheClient>(c => new MemoryCacheClient());
container.Register<IUserAuthRepository>(c => authRepo);

Plugins.Add(
    new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] { new BasicAuthProvider() })
);

当执行没有授权标头或错误的用户名+传递的请求时,响应是重定向到 /Account/Login.aspx?ReturnUrl=...

部分请求 + 响应示例:

POST http://localhost:60278/reserve HTTP/1.1

HTTP/1.1 302 Found
Location: /Account/Login.aspx?ReturnUrl=%2freserve
X-Powered-By: ServiceStack/3,924 Win32NT/.NET

有没有办法让它只响应 HTTP 401 Unauthorized 或 HTTP 403 Forbidden ?

4

2 回答 2

22

默认情况下,ServiceStack 的 AuthFeature 只会尝试将您重定向到HTML Content-Type 请求的默认~/login路径。您可以通过将 AuthFeature 中的重定向路径设置为 null 来覆盖它:

Plugins.Add(new AuthFeature(...) { HtmlRedirect = null });

这将回退到401 UnAuthorized其他内容类型获得的标准响应。

将 HtmlRedirect 全局设置为 null 后,您可以临时将其添加回来,例如:

[Authenticate(HtmlRedirect="~/path/to/redirect/to")]
于 2012-10-25T16:38:33.230 回答
1

如果以下方法不起作用:

Plugins.Add(new AuthFeature(...) { HtmlRedirect = null });

尝试将 设置OverrideHtmlRedirect = false为提供程序。这适用于NetCoreIdentityAuthProvider- 特别是对于 JWT 不记名身份验证

Plugins.Add(
  new AuthFeature(..., 
  new CustomAuthProvider(AppSettings) { OverrideHtmlRedirect = false }
) { HtmlRedirect = null });

如果一切都失败了,请检查 Github 代码以查看是否强制执行 html 重定向

于 2020-01-17T06:00:30.943 回答