C# windowsphone8开发与应用;WebAPI-通过表单身份验证?

C# windowsphone8开发与应用;WebAPI-通过表单身份验证?,c#,authentication,windows-phone-8,asp.net-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构建一个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或其他本机移动应用程序开发身份验证兼容?

如果连续请求将cookie附加到登录操作的第一个请求,则此方法肯定会起作用

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

对于本机应用程序,这可能是个骗局,因为这意味着必须使用同一个客户端代理实例,或者您可以找到一种方法,为身份验证cookie提供临时本地存储,并将这些cookie附加到每个请求中

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

这是因为您的站点可能会与外部身份提供商(ADFS、Azure Active Directory、Google、Facebook等)联合,以便在另一个站点中进行实际身份验证,并且您的站点只会获得符合所使用的单点登录协议(OAuth2、WS-Federation)的响应

在这种情况下,在服务器端使用成对的登录名/密码来获取用户的身份确实不容易

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


听起来很棘手,但我们发现一些联合场景中,各方之间的实际SSO协议没有得到保证,从托管web浏览器中模拟被动场景是唯一可靠的方法。

我通过JS使用WebApi进行表单验证,CORS就是这样

装饰控制器(如果您需要使用CORS)(认为您可能需要一个nuget软件包)

一旦您的凭证设置为“快乐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);
    }
});
然后可以访问任何身份验证、修饰的控制器,然后随每个请求一起发送cookie

[Authorize]
如果你有任何问题,大声喊

Microsoft_Press_电子书_编程_Windows_8_应用程序_HTML_CSS_JavaScript_2E_PDF.PDF


有一些关于使用WinJS传递XHR的详细信息

“在使用WinJS构建的WP8应用程序/通用应用程序中如何处理此问题?我可以做同样的事情吗?通过HTTPS发送登录/注册凭据并使用Websecurity处理表单身份验证?”我想如果使用表单身份验证,您会很好,您必须合成请求帖子并处理从服务器返回的cookie。如果本机应用程序仅通过表单(无第三方身份验证)接受标准用户名/密码,我们是否需要担心您提到的缺点?此外,当WP8上的本机应用程序(如facebook)接受用户名/密码进行身份验证时,他们最有可能进行表单身份验证,还是有其他更适合本机移动应用程序的机制?Facebook使用OAuth2协议的用户名密码流进行身份验证。OAuth2有多个支持不同场景的流,U-P用于活动场景。如果Facebook进一步联合,这将不起作用,或者需要大量定制工作。如果您没有计划任何联邦方案,那么如果您想托管自定义用户名/密码表单,OAuth2的U-P仍然是一个不错的选择。阅读更多关于流程的信息,例如这里请注意,OAuth2和您计划的方法之间的区别在于,连续的请求携带的不是cookie,而是身份提供者发布的OAuth2头。谢谢Wiktor。既然我们已经为web客户机实现了Forms auth,这是否意味着我们必须为移动客户机安装另一个AuthController,或者您是否建议不要引入OAuth而继续使用?
[Authorize]