我正在使用WebAPI构建API,该API将通过HTTPS从Web浏览器客户端通过SSL接受身份验证信息。 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.");
}
此方法是否与WP8或其他原生移动应用开发认证兼容?
答案 0 :(得分:2)
假设连续请求带有附加到Login
操作的第一个请求的cookie,肯定会有效。
如果浏览器应用程序使用ajax,则此功能开箱即用,因为连续的ajax请求会携带由同一域发出并附加在当前浏览器会话中的所有Cookie。
如果是本机应用程序,这可能会变得棘手,因为这意味着必须使用相同的客户端代理实例,或者您找到了一种方法来为身份验证cookie提供临时本地存储,并将这些cookie附加到每个请求。 / p>
但是,此请求存在潜在的缺点:您假设登录方法可以在活动方案中使用登录名/密码来生成表单cookie。而且这并不总是那么简单。
这是因为您的网站可能与外部身份提供商(ADFS,Azure Active Directory,Google,Facebook等)联合,以便实际身份验证在另一个网站中进行,您的网站只能获得符合使用的单一登录协议(OAuth2,WS-Federation)。
在这种情况下,实际上没有简单的方法可以在服务器端使用配对登录/密码来获取用户的身份。
在这种情况下,身份提供者未知的解决方法是托管Web浏览器控件(如果可能)并让它执行被动身份验证方案 - 这意味着您导航到应用程序页面并让Web浏览器控制自动302到登录页面,无论需要多少次重定向。然后,用户在提供者页面提供凭据,Web浏览器一直重定向回您的应用程序,这是您在服务器端捕获身份,关闭Web浏览器控件并以某种方式(取决于实际的Web浏览器主机)的位置阅读身份验证cookie,以便将其附加到进一步的请求中。
听起来很棘手,但我们发现了一些联邦方案,其中各方之间的实际SSO协议无法得到保证,并且托管网络浏览器内的被动方案的模拟是唯一可靠的方式。
答案 1 :(得分:0)
我使用WebApi通过JS来执行表单身份验证,这是使用CORS的方法
装饰控制器(如果你需要使用CORS)(想想你可能需要一个nuget包)。
[EnableCors(origins: "*", headers: "*", methods: "*")]
一旦您对凭据设置cookie感到满意
FormsAuthentication.SetAuthCookie
这是HTML页面的Ajax,
$.ajax({
type: 'Post',
url: 'http://' + api + '/?alloworigin=true',
data: { Username: "test", Password: "test12" },
dataType: 'json',
xhrFields: {
withCredentials: true
},
success: function(data) {
var x = data;
},
error: function(msg) {
alert( msg.responsetext);
}
});
然后可以访问任何auth,装饰控制器,然后随每个请求发送cookie
[Authorize]
如果您有任何问题,请大声喊。
Microsoft_Press_eBook_Programming_Windows_8_Apps_HTML_CSS_JavaScript_2E_PDF.pdf
http://aka.ms/611111pdf有一些关于使用WinJS传递XHR的详细信息