Ws-Federation身份信息在Web API中不可用?

时间:2016-11-02 18:36:02

标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-web-api

我正在使用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);
                    }
                }
            });

2 个答案:

答案 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身份验证的情况下,解决方案是:

  1. 将承载令牌身份验证中间件添加到我的应用

  2. 创建一个Web API端点(理想情况下是加密命名的),它将安全地接收Ws-Federation声明,执行验证以确保请求真正来自您的MVC控制器,使用它们生成承载令牌,并使用生成的承载令牌

  3. 在MVC中进行身份验证后,序列化声明,并使用之前创建的端点将其封送到Web API

  4. 将持有人令牌添加到SPA中的隐藏字段

  5. 很多,非常感谢@Juan为我提供反馈和链接,指出我正确的方向。