我正在使用带有OWIN启动类的Umbraco 7.5。
尽管使用 cookie 身份验证存在缺点,但我还是尝试在 MVC 和 Web API 之间共享 cookie 身份验证。
我的OWIN启动课程中有这个:
private static void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
CookieSecureOption secureCookieOption = CookieSecureOption.SameAsRequest;
#if DEBUG
secureCookieOption = CookieSecureOption.Never;
#endif
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
AuthenticationMode = AuthenticationMode.Active,
LoginPath = new PathString("/Account/Login"),
CookieSecure = secureCookieOption,
CookieManager = new ChunkingCookieManager(),
Provider = new CookieAuthenticationProvider()
}, PipelineStage.Authenticate);
//configure B2C OAuth middleware
foreach (string policy in AppSettings.B2CPolicies)
{
app.UseOpenIdConnectAuthentication(CreateBearerOptionsFromPolicy(policy));
}
// Use a cookie to temporarily store information about a user logging in with a third party login provider
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
}
就 Umbraco和自定义 MVC 页面而言,这工作正常 - 当前用户身份可用,Umbraco 帮助程序方法按预期工作。
但是,对于 Web API 控制器 - 无论是从 UmbracoApiController 派生还是仅派生 ApiController,HTTP 上下文上的当前用户标识始终为空。我已经检查了发送到API控制器的浏览器请求,并且包含ASPNET身份cookie,所以我对为什么这不会转换为线程和httpcontext上的用户身份感到困惑。有人能对此有所了解吗?
编辑:有关此的更多信息 - 我尝试创建自己的自定义cookie 认证中间件并取代标准MS CookieAuthenticationHandler 与我的自定义实现,以便我 可以通过它跟踪呼叫。有趣的是,对于普通的 MVC 页面上,在页面加载时调用 AuthenticateCoreAsync 方法, 成功读取 cookie 并返回有效的身份验证 票。对于 Web API 调用,AuthenticateCoreAsync 方法不是 在命中 API 方法之前完全调用。
我找到了答案 - 这与 OWIN 无关,而与我的 Web API 初始化代码有关。我将自托管 Web API 所需的代码与使 Web API 作为 MVC 应用程序的一部分运行所需的代码混合在一起。而不是IAppBuilder.UseWebApi(),我应该使用GlobalConfiguration.Configure()
所以工作代码看起来像这样:
public static void Configure(IAppBuilder app)
{
GlobalConfiguration.Configure(Register);
}
private static void Register(HttpConfiguration config)
{
ConfigureHttpRoutes(config);
ConfigureFormatters(config);
//etc...
}
在这个SO问题中也遇到了类似的问题。