c# - Windows Phone 8 开发和 Web API - 通过表单例份验证进行身份验证?

标签 c# authentication windows-phone-8 asp.net-web-api

我正在使用 WebAPI 构建一个 API,它将通过 HTTPS 从 Web 浏览器客户端接受通过 SSL 的身份验证信息。 Web 浏览器使用表单例份验证并需要 HTTPS,因此它可以安全地将用户名/密码发送到 API 端点。我的 API 使用 Websecurity.Login() 和 Websecurity.Logout() 来处理 Web 客户端的身份验证。

这将如何在使用 WinJS 构建的 WP8 应用程序/通用应用程序中处理?我可以做同样的事情 - 通过 HTTPS 发送登录/注册凭据并使用 Websecurity 来处理表单例份验证吗?

这是我的 WebAPI 当前为身份验证设置的方式:

public HttpResponseMessage LogIn(LoginModel model)
{
    if (ModelState.IsValid)
    {
        if (User.Identity.IsAuthenticated)
        {
            return Request.CreateResponse(HttpStatusCode.Conflict, "already logged in.");
        }

        if (WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
        {
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
            return Request.CreateResponse(HttpStatusCode.OK, "logged in successfully");
        }
        else
        {
            return new HttpResponseMessage(HttpStatusCode.Unauthorized);
        }
    }

    // If we got this far, something failed
    return new HttpResponseMessage(HttpStatusCode.InternalServerError);
}

public HttpResponseMessage LogOut()
{
    if (User.Identity.IsAuthenticated)
    {
        WebSecurity.Logout();
        return Request.CreateResponse(HttpStatusCode.OK, "logged out successfully.");
    }

    return Request.CreateResponse(HttpStatusCode.Conflict, "already done.");
}

此方法是否与 WP8 或其他原生移动应用程序开发身份验证兼容?

最佳答案

它肯定会工作,假设连续的请求携带附加到 Login 操作的第一个请求的 cookie。

对于使用 ajax 的浏览器应用程序,这是开箱即用的,因为连续的 ajax 请求携带由同一域发出并附加在当前浏览器 session 中的所有 cookie。

在 native 应用程序的情况下,这可能更棘手,因为这意味着必须使用相同的客户端代理实例,或者您找到一种方法来为身份验证 cookie 提供临时本地存储并将这些 cookie 附加到每个请求。

但是,此请求有一个潜在的缺点:您假设登录方法可以在事件场景中使用登录名/密码来生成表单 cookie。这并不总是那么简单。

这是因为您的网站可能会与外部身份提供者(ADFS、Azure Active Directory、Google、Facebook 等)联合,以便实际身份验证发生在另一个网站,而您的网站只会获得符合使用的单点登录协议(protocol)(OAuth2、WS-Federation)。

在这种情况下,确实没有简单的方法可以在服务器端使用登录名/密码对来获取用户的身份。

在身份提供者未知的情况下,解决方法是托管网络浏览器控件(如果可能)并让它执行被动身份验证方案 - 这意味着您导航到应用程序页面并让网络浏览器控制自动 302 到登录页面,无论需要多少次重定向。然后,用户在提供商页面提供凭据,Web 浏览器将一路重定向回您的应用程序,这是您在服务器端捕获身份、关闭 Web 浏览器控件以及以某种方式(取决于实际的 Web 浏览器主机)的地方读取身份验证 cookie,以便您可以将其附加到进一步的请求。

听起来很棘手,但我们发现了一些联合场景,其中各方之间的实际 SSO 协议(protocol)得不到保证,而在托管 Web 浏览器中模拟被动场景是唯一可靠的方法。

关于c# - Windows Phone 8 开发和 Web API - 通过表单例份验证进行身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23841540/

相关文章:

c# - C++ .NET DLL 包装到 C# COM DLL(使用 Mono 构建)

Linux 服务器登录屏幕

c# - 在windows phone 8中取消语音合成

iphone - 从 Iphone native 客户端使用 Google App Engine 进行身份验证

windows-phone-8 - 如何使用 "software navigation bar"检测 Windows Phone 设备?

windows-phone-7 - 根据用户交互动态加载 XAML 布局

c# - Java 与 .Net 中的对象生命周期

c# - mongodb c#选择特定字段

C# Web 应用程序问题

git - 我怎样才能 "login"到 git?