2014-05-24 46 views
7

我正在用WebAPI構建一個API,它將通過HTTPS從Web瀏覽器客戶端接受通過SSL的認證信息。 Web瀏覽器使用表單身份驗證並需要HTTPS,因此它可以安全地將用戶名/密碼發送到API端點。我的API使用Websecurity.Login()和Websecurity.Logout()來處理Web客戶端的身份驗證。Windows Phone 8開發和WebAPI - 通過表單認證身份驗證?

這將如何處理在WP8應用程序/通用應用程序與WinJS構建?我可以做同樣的事情 - 通過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或其他原生移動應用開發認證兼容?

+0

「這將如何獲得與WinJS構建的WP8應用程序/通用應用處理,我可以做同樣的事情的一些細節 - 發送登錄/通過HTTPS註冊憑證並使用Websecurity處理表單身份驗證?「我認爲你會沒事的,如果你使用表單身份驗證,你必須合併請求發佈,並處理從服務器返回的cookie。 –

回答

2

這肯定會起作用,假設連續請求攜帶附加到Login動作的第一個請求的cookie。

如果使用ajax的瀏覽器應用程序開箱即用,因爲連續的ajax請求會攜帶由同一個域發出並附加在當前瀏覽器會話中的所有Cookie。

在本機應用程序的情況下,這可能比較費力,因爲這意味着必須使用相同的客戶端代理實例,或者您找到一種方法爲臨時本地存儲身份驗證Cookie並將這些cookie附加到每個請求。

但是,此請求存在潛在的缺陷:您認爲登錄方法可以在活動方案中使用登錄名/密碼來生成表單cookie。這並不總是那麼簡單。

這是因爲您的網站可能會與外部身份提供商(ADFS,Azure Active Directory,Google,Facebook等)進行聯合,以便在另一個網站上進行實際身份驗證,並且您的網站只會獲得符合到使用的單點登錄協議(OAuth2,WS-Federation)。

在這種情況下,真的沒有簡單的方法在服務器端使用pair login/password來獲取用戶的身份。

在身份提供者未知的情況下,解決方法是託管網頁瀏覽器控件(如果可能)並讓其執行被動身份驗證方案 - 這意味着您導航到應用程序頁面並讓Web瀏覽器無論有多少重定向,它都會自動控制302到登錄頁面。然後,用戶在提供者頁面提供憑證,並且Web瀏覽器重定向到應用程序,這就是您在服務器端捕獲身份,關閉Web瀏覽器控件並以某種方式(取決於實際的Web瀏覽器主機)閱讀身份驗證cookie,以便您可以將其附加到更多請求。

聽起來很棘手,但我們發現了一些聯邦方案,其中各方之間的實際SSO協議無法得到保證,託管網絡瀏覽器內被動方案的這種模擬是唯一可靠的方法。

+0

如果本機應用程序只會通過表單(無第三方認證)接受標準用戶名/密碼,那麼我們是否必須擔心您提到的缺點? – SB2055

+0

此外 - 當WP8上的原生應用程序(如Facebook)接受用戶名/密碼進行身份驗證時,他們最有可能正在執行表單身份驗證,還是有另一種更適合原生移動應用程序的機制? – SB2055

+0

Facebook使用OAuth2協議的用戶名 - 密碼流進行身份驗證。 OAuth2具有支持不同場景的多個流程,而U-P針對活動場景。如果Facebook將進一步聯合,這將無法工作,或者需要大量的定製工作。如果您不計劃任何聯合方案,如果您希望託管自定義用戶名/密碼錶單,則OAuth2的U-P仍然是一個不錯的選擇。請閱讀有關此流程的更多信息,例如https://help.salesforce.com/HTViewHelpDoc?id=remoteaccess_oauth_username_password_flow.htm&language=en_US –

0

我用的WebAPI通過JS做窗體身份驗證,這是如何與CORS

裝修控制器(如果你需要使用CORS)(認爲你可能需要一個NuGet包爲這個)。

[EnableCors(origins: "*", headers: "*", methods: "*")] 

一旦你滿意的憑據設置cookie的

FormsAuthentication.SetAuthCookie 

這是阿賈克斯的HTML頁面,

$.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_eBook_Programming_Windows_8_Apps_HTML_CSS_JavaScript_2E_PDF.pdf

http://aka.ms/611111pdf對通過XHR與WinJS