我正在使用Ws-Fed身份验证OWIN中间件使用ADFS使用Web API端点对ASP.NET MVC应用进行身份验证。我能够成功使用ADFS登录,并且在我的MVC控制器上,HttpContext.User.Identity.IsAuthenticated是真的 - 我也可以看到已登录用户的声明信息。
但是对于WebAPI端点,User.Identity.IsAuthenticated为false。签名用户的声明信息也不可用。有什么方法可以揭示用户是否经过MVC和WebAPI控制器的身份验证?
以下是我在OWIN Startup类中配置身份验证中间件的方法:
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
ExpireTimeSpan = TimeSpan.FromMinutes(sessionDuration),
SlidingExpiration = true //expiration extended after each request
});
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
Wtrealm = realm,
MetadataAddress = metadata,
Notifications = new WsFederationAuthenticationNotifications
{
AuthenticationFailed = context =>
{
context.HandleResponse();
context.Response.Redirect("/?loginfailed=loginfailed");
return Task.FromResult(0);
}
}
});
答案 0 :(得分:1)
尝试添加"名称ID"声称ADFS:
http://darb.io/blog/2014/06/30/WebAPI-and-ADFS-as-external-login-provider/
答案 1 :(得分:0)
所以我通过检查CodePlex上的OWIN cookie身份验证中间件源代码找到了这个问题的答案。由MVC控制器使用中间件创建的Cookie的创建方式与Cookie创建的Web API不同。 MVC cookie是对会话中存储的用户信息的引用,由于Web API完全是无状态的(无会话),因此在MVC中创建的cookie不能在Web API中使用。
此外,无论如何在Web API中使用cookie身份验证是不好的做法;承载令牌认证是一种更好的选择。
在我需要使用Ws-Federation身份验证的情况下,解决方案是:
将承载令牌身份验证中间件添加到我的应用
创建一个Web API端点(理想情况下是加密命名的),它将安全地接收Ws-Federation声明,执行验证以确保请求真正来自您的MVC控制器,使用它们生成承载令牌,并使用生成的承载令牌
在MVC中进行身份验证后,序列化声明,并使用之前创建的端点将其封送到Web API
将持有人令牌添加到SPA中的隐藏字段
很多,非常感谢@Juan为我提供反馈和链接,指出我正确的方向。