如何在使用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."); }
此方法是否与WP8或其他本机移动应用程序开发身份验证兼容?
解决方法
对于使用ajax的浏览器应用程序,这是开箱即用的,因为连续的ajax请求携带由同一域发出并附加在当前浏览器会话中的所有cookie.
在本机应用程序的情况下,这可能是tricker,因为这意味着必须使用相同的客户端代理实例,或者您找到了一种方法来为身份验证cookie提供临时本地存储,并将这些cookie附加到每个请求.
但是,此请求存在潜在的缺点:您假设登录方法可以在活动方案中使用登录名/密码来生成表单cookie.这并不总是那么简单.
这是因为您的站点可能与外部身份提供商(ADFS,Azure Active Directory,Google,Facebook等)联合,以便实际身份验证在另一个网站中进行,并且您的网站仅获得符合单一标志的响应使用的协议(OAuth2,WS-Federation).
在这种情况下,实际上没有简单的方法在服务器端使用对登录/密码来获取用户的身份.
在这种情况下,身份提供者未知的解决方法是托管Web浏览器控件(如果可能)并让它执行被动身份验证方案 – 这意味着您导航到应用程序页面并让Web浏览器自动控制302登录页面,无论需要多少次重定向.然后,用户在提供者页面提供凭据,Web浏览器一直重定向回您的应用程序,这是您在服务器端捕获身份,关闭Web浏览器控件并以某种方式(取决于实际的Web浏览器主机)的位置阅读身份验证cookie,以便您可以将其附加到进一步的请求.
听起来很棘手,但我们发现了一些联邦方案,其中各方之间的实际SSO协议无法得到保证,并且托管Web浏览器内的被动方案的这种模拟是唯一可靠的方式.