Rob*_*ous 7 c# authentication asp.net-web-api windows-phone-8
我正在使用WebAPI构建一个API,它将通过Web从Web浏览器客户端通过HTTPS接受身份验证信息.Web浏览器使用表单身份验证并需要HTTPS,因此可以安全地将用户名/密码发送到API端点.我的API使用Websecurity.Login()和Websecurity.Logout()来处理Web客户端的身份验证.
如何在使用WinJS构建的WP8应用程序/通用应用程序中处理这个问题?我可以做同样的事情 - 通过HTTPS发送登录/注册凭据并使用Websecurity来处理表单身份验证吗?
以下是我的WebAPI目前如何设置为auth:
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.");
}
Run Code Online (Sandbox Code Playgroud)
此方法是否与WP8或其他本机移动应用程序开发身份验证兼容?
假设连续的请求携带附加到操作的第一个请求的 cookie,它肯定会起作用Login
。
对于使用 ajax 的浏览器应用程序来说,这是开箱即用的,因为连续的 ajax 请求携带由同一域发出并附加在当前浏览器会话中的所有 cookie。
对于本机应用程序,这可能会很棘手,因为这意味着必须使用相同的客户端代理实例,或者您找到一种方法来为身份验证 cookie 提供临时本地存储并将这些 cookie 附加到每个请求。
但是,此请求有一个潜在的缺点:您假设登录方法可以在活动场景中使用登录名/密码来生成表单 cookie。这并不总是那么简单。
这是因为您的网站可能与外部身份提供商(ADFS、Azure Active Directory、Google、Facebook 等)联合,以便实际身份验证在另一个网站中进行,而您的网站仅获得符合单点登录的响应使用的协议(OAuth2、WS-Federation)。
在这种情况下,确实没有简单的方法可以在服务器端使用登录名/密码对来获取用户的身份。
在身份提供者未知的情况下,解决方法是托管 Web 浏览器控件(如果可能)并让它执行被动身份验证方案 - 这意味着您导航到应用程序页面并让 Web 浏览器控件自动 302登录页面,无论需要多少次重定向。然后,用户在提供商页面提供凭据,Web 浏览器会一路重定向回您的应用程序,您可以在服务器端捕获身份,关闭 Web 浏览器控件并以某种方式(取决于实际的 Web 浏览器主机)读取身份验证 cookie,以便您可以将其附加到进一步的请求。
听起来很棘手,但我们发现了一些联合场景,其中各方之间的实际 SSO 协议无法得到保证,而从托管 Web 浏览器内模拟被动场景是唯一可靠的方法。