Dela med dig av din Live Mesh information - Live ID Delegated Authentication

I min förra artikel skrev jag om hur du kan använda Live Mesh för att lagra din applikationsdata i molnet samtidigt som den synkroniseras och görs tillgänglig på dina enheter.
Scenariot var en inköpslista som jag vill kunna underhålla och konsumera både på min dator i hemmet och på min Windows Mobile lur när jag väl är ute i handeln. Jag tänkte nu utöka scenariot med möjligheten att kunna dela med mig av min information;

I veckan var jag och storhandlade. Jag tog en stor kundvagn och startade inköpslistan i luren. Jag hittar inte så bra i den affären som  jag åkte till vilket gjorde att jag fick springa fram och tillbaka många gånger innan jag hade fyllt vagnen med vad jag skulle. Tänk om jag kunde gå in på den aktuella stormarknadens hemsida och låta dem konsumera min inköpslista för att sedan komplettera den med information om var jag hittar de olika varorna i butiken - Så mycket snabbare mitt besök skulle gå!

Delegated Authentication innebär att jag kan dela med mig av en begränsad del av min Live Services informationsmängd till en tjänst som kan konsumera informationen på begäran och efter godkännande av mig. Informationsmängden kan t ex vara mina kontakter eller som i detta fall min inköpslista. Inom min Mesh är ett MeshObject en informationsmängd som jag kan dela med mig av.

Stormarknadens hemsida skulle, precis som i mitt tidigare exempel, skapa  en LiveOperatingEnvironment instans för att komma åt informationen. Skillnaden är att den inte använder mina Live ID inloggningsuppgifter för att ansluta utan använder istället en så kallad Consent Token.

 loe.Connect(token.DelegationToken, AuthenticationTokenType.DelegatedAuthToken, 
    new Uri(uri),new LiveItemAccessOptions(true));

Det är denna Token som tillåter dem konsumera efterfrågad information och inget annat. För att utfärda en Consent Token tas jag till Live ID webbplatsen, får logga in som vanligt, och godkänna stormarknadens nyttjande av min inköpslista.

image

image 

För att möjliggöra detta behöver de ange vilket MeshObject de vill ha tillgång till och vad de vill göra med det. Mitt MeshObject med inköpslistan heter MeshShoppingList och stormarknaden vill läsa det (Read).  Följande rad återfinns i web.config.

 <add key="wll_appoffers" value="MeshShoppingList.Read" />

Aktuellt Offer tillsammans med en del annan information skickas till den sk Consent sidan. För att få hälp med att sätta ihop URL:en använder de WindowsLiveLogin exempelklassen från Live Framework SDK.

 private void RedirectToConsentPage() {
    WindowsLiveLogin liveLogin = new WindowsLiveLogin(true); 
    var thisUrl = Request.RawUrl;
    var returnUrl = ConfigurationManager.AppSettings["wll_delauth_returnurl"];
    returnUrl += "?ReturnUrl=" + Server.UrlEncode(thisUrl);
    string offsers = ConfigurationManager.AppSettings["wll_appoffers"];
    var consentUrl = liveLogin.GetConsentUrl(offsers, string.Empty, returnUrl); 
    Response.Redirect(consentUrl);
}

Consent sidan returnerar Consent Token till stormarknadens hemsida och de kan då läsa efterfrågat MeshObject.

 <ul>
<% foreach (var shoppingList in (IEnumerable<Microsoft.LiveFX.Client.DataEntry>)ViewData["shoppingList"]) { %>
    <% var item = shoppingList.Resource.GetUserData<MeshShoppingList.ShoppingListItem>(); %>
    <li><%=item.Priority + ": " + item.Title + " (" + item.Category +")" %></li>    
<% } %>
</ul>

image

För att provköra detta “på riktigt” kan du ta en titt på nätverkswebbplatsen LinkedIn. De använder Live ID Delegated Authentication för att kunna erbjuda import av dina befintliga kontakter till ditt LinkedIn nätverk. Titta också på vad som händer om du klickar i att du vill importera kontakter från Googles Gmail; du får ange ditt Google användarnamn och lösenord. Man kanske litar på LinkedIn i detta fall men i praktiken kan de göra vad de vill med ditt Google konto efter det. Skicka mail t ex..

Delegated Authentication till folket!

-c