Mario Meir-Huber

C#, VB.Net, Silverlight, XNA, VSTO, Sharepoint

März 2008 - Einträge

Problem bei der Verschlüsselung von app.config-Dateien in Netzwerk-Anwendungen bei unterschiedlichen Clients

Der Microsoft Student Partner, Roman Schacherl (FH Hagenberg) ist auf ein sehr interessantes Problem bei der Verschlüsselung von ConnectionStrings mit verschiedenen Clients gestoßen. Der Lösungsansatz ist unten aufgelistet:

Diese Anleitung beschreibt die Verschlüsselung eines Connection Strings in der app.config einer .NET
2.0 Windows-Anwendung, die über das Netzwerk aufgerufen wird. Dabei ist es notwendig, den
privaten Schlüssel der Verschlüsselung auf den Client-Rechner zu übertragen – ansonsten ist keine
Entschlüsselung mehr möglich.
Unverschlüsselte Konfigurationsdatei
In der app.config-Datei steht im Abschnitt <connectionStrings> die Verbindung zur
Datenbank:

 

<connectionStrings>
 

<add name="testConnectionString" connectionString="Data Source=pc-roman;Initial Catalog=testdb;
user id=test_user;password=test_pwd"
providerName="System.Data.SqlClient" />


</connectionStrings>

 

Erstellen eines RSA-Schlüsselcontainers
Mit Hilfe des Tools aspnet_regiis wird ein neuer Schlüsselcontainer erstellt. Führen Sie
folgenden Befehl in einer Eingabeaufforderung im Ordner
„C:\Windows\Microsoft.NET\Framework\v2.xxx“ aus:

 

aspnet_regiis –pc "TestKeys" -exp

 

Hinzufügen eines ProtectionProviders
Fügen Sie unmittelbar vor dem Abschnitt <connectionStrings> folgenden
<configProtectedData>-Abschnitt hinzu, wobei das Attribut name der Name des
ProtectionProviders ist (später wichtig) und der keyContainerName der Namen des soeben
erstellten Schlüsselcontainers sein muss.

 

<configProtectedData>
<providers>
<add name="TestProvider"
type="System.Configuration.RsaProtectedConfigurationProvider,
System.Configuration, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a,
processorArchitecture=MSIL"
keyContainerName="TestKeys"
useMachineContainer="true" />
</providers>
</configProtectedData>

 

Verschlüsseln der Konfigurationsdatei
Mit folgendem Sourcecode können Sie die Verschlüsselung der app.config bewirken. Der
Parameter der Methode OpenExeConfiguration muss dabei dem Pfad der exe-Datei und nicht
der exe.config-Datei entsprechen!

 

Configuration conf = ConfigurationManager.OpenExeConfiguration(exeFilename);
ConfigurationSection section = conf.GetSection("connectionStrings");
if (section != null)
{
if (!section.IsReadOnly())
{
section.SectionInformation.ProtectSection("TestProvider");
conf.Save();

 

Der Abschnitt <connectionStrings> in der Konfigurationsdatei ist nun verschlüsselt:

<connectionStrings configProtectionProvider="TestProvider">
<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<KeyName>Rsa Key</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>humGLBAxftFdI0GnKsRjyd8gPWXAFtftnaLjc0e5Z/hs7G02icfMU7U9aqL5jiJV1KVCeO/Wm
xA6ihExMg64Gj7Fq9amDKA+V1asWo4JdACrdhNwhAARynycabICbVPW+MDV+aYglwejUe4OeEVY0fi+1xc+utK
L2HLJlDDrSgI=</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>QV46wMOK2c78NM/ngakm1NZ54YhDdq4fsh2G+yMoe+kRTxE8aDAgbizM6FjfiPfAMAYD8CXWP
AEc0Mi2CSGPEdUB4AXPthDmyFJ53+5mf4ni9lYD6KAO61cmqKx5oUUGqE74mjDFVu4J+8mUTJr7I9YxcWf2IXl
qDM2PE3wGNWL5LmWE2t3Sl0UxSbIGFrEluVscWgoevnMPt39fOOW3R0AgrXEofwjCGlL6yEJKCwBQw297pGAWn
HjZ0bwOU64ebR4FHnl9twV8DRCZGF5Vq4sJIpBjwfe/THSprr0xuIeAD1T6R9CRB9leiMuQfBYHLS1B2nT5Nda
3GCkIEoTB1G0P9gt1sPl8nKmiWtNUN9U=</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>

 

Die Anwendung ist lokal weiterhin lauffähig, solange der entschlüsselnde Rechner gleich
dem verschlüsselnden Rechner ist. Für die Entschlüsselung sorgt .NET automatisch. Um die
Anwendung auch über das Netzwerk lauffähig zu machen, muss zuerst der
Schlüsselcontainer exportiert und importiert werden.


Exportieren des Schlüsselcontainers
Zum Exportieren des Schlüsselcontainers in eine xml-Datei wird wieder das Tool
aspnet_regiis verwendet:

aspnet_regiis –px "TestKeys" "C:\test-keys.xml" -pri

 

Importieren des Schlüsselcontainers
Auf jedem Client, auf dem die Anwendung lauffähig sein soll, muss jetzt der
Schlüsselcontainer wieder importiert werden:

 

aspnet_regiis –pi "TestKeys" "C:\test-keys.xml"

 

Anschließend liegt der Connection String in verschlüsselter Form vor und wird beim Start der
Anwendung (auch über das Netzwerk) automatisch entschlüsselt.
Dabei muss hingewiesen werden, dass es sich nur um eine relativ einfache Sicherheitsmaßnahme
handelt – nachdem der Private Key bekannt ist, lässt sich relativ leicht ein kleines .NET-Programm zur
Entschlüsselung und Anzeige der Konfigurationsdatei im Klartext erstellen.
Zusätzlich zu den beschriebenen Maßnahmen muss die Codezugriffssicherheit am Client angepasst
werden, um die Ausführung der Anwendung über das Netzwerk überhaupt zu erlauben.

 

Gefunden von: Roman Schacherl - www.schacherl.info

Silverlight Forum auf Vb-Magazin.de

Auf Vb-Magazin.de gibt es nun auch ein eigenes Silverlight-Forum. Hier wird bei Problemen und Fragen jeglicher Art über die Silverlight-Entwicklung geholfen.

Richtig Zoomen in DeepZoom

Nachdem ich die ersten Hindernisse von DeepZoom überstanden habe dachte ich mir ich werde es mal allen Lesern dieses Blogs mitteilen wie man richtig Zoomed in Silverlight. Hierfür ist lediglich ein Multiscale-Image notwendig, welches ein DeepZoom Image enthält. Dieses wird z.B. mit Deep Zoom Composer erstellt.

Des weiteren ist es noch wichtig, das die Dateien, welche für Deep Zoom verwendet werden sich im ClientBin Verzeichnis befinden (sonst gibt's ne Böse Runtime Exception)

Nun gehe ich mal davon aus das ein "+" und ein "-" auf der Tastatur für's zoomen verwendet wird. Hierfür brauchen wir lediglich einen KeyDown-Event auf der Seite.

Das MultiScaleImage Objekt enthält bereits einige nette Funktionen. So können wir mit ZoomAboutLogicalPoint sehr einfach Zoomen. Diese Funktion benötigt 3 Parameter:

  1. Zoomfaktor (1.0 ist 100% - es ändert sich also nichts; 2.0 würde bedeuten das es 2x so groß wird, ...)
  2. X Position (Position über welche gezoomed wird - X)
  3. Y Position (Position über welche gezoomed wird - Y)

Die 2 Positionen sind jeweils von 0.0 bis 1.0 - geben also einen Prozentsatz des MultiScaleImage-Objekts an. Um die korrekte Position zu erfragen müssen wir vorerst die Mausposition abfragen (am besten im MouseMove in eine Var. vom Typ Point geben). Danach müssen wir die Mausposition in einem Wert zwischen 0.0 und 1.0 umrechnen - entweder anhand der Page oder anhand des MultiScaleImage-Objekts, sollte dies nicht der Page-Größe entsprechen).

Die nun errechnete Position geben wir als X und Y an die ZoomAboutLogicalPoint-Funktion weiter. Hierfür ist jedoch noch eine weitere Berechnung notwendig: Da das Image ja größer/kleiner wird, ist man nicht zwangsweise in einem Bereich zwischen 0 und 1. Dies würde dazu führen das man immer weiter oben zoomed. Um dies zu korrigieren gibt es die "ElementToLogicalPoint" Funktion des MultiScaleImage-Objekts.

Das ganze sieht dann in etwa so aus:

void Page_KeyDown(object sender, KeyEventArgs e)
{
    double xpos = 1.0 / this.Width * zoomPosition.X;
    double ypos = 1.0 / this.Width * zoomPosition.Y;

    if (e.Key == Key.Add)
    {
        this.deepZoomObject.ZoomAboutLogicalPoint(1.1, deepZoomObject.ElementToLogicalPoint(zoomPosition).X, deepZoomObject.ElementToLogicalPoint(zoomPosition).Y);
    }
    if (e.Key == Key.Subtract)
    {
        this.deepZoomObject.ZoomAboutLogicalPoint(0.9, deepZoomObject.ElementToLogicalPoint(zoomPosition).X, deepZoomObject.ElementToLogicalPoint(zoomPosition).Y);

    }
}

 

Anmerkung: zoomPosition wird in MouseMove gesetzt.

Morgen werde ich dann über DeepZoom Drag&Drop berichten.

Silverlight 2 : Deep Zoom & Developer Referenz

Eines der neuen Features von Silverlight 2.0 Beta 1 ist Deep Zoom. Dies stellt die Möglichkeit dar, sehr große Bilder zu skalieren und zu Zoomen. Das ganze funktioniert über ein MultiScaleImage-Objekt.

Im Web gibt es bereits einige äußerst interessante Beispiele, eines davon ist die Memorabilia des Hard Rock Café:

http://memorabilia.hardrock.com/

Weiters sehr interessant ist die Developer Referenz: Auch diese wurde mit einem MultiScaleImage realisiert.

http://joestegman.members.winisp.net/DeepZoom/

Visual Basic contra C# in der Office Entwicklung

Gerade eben schreibe ich an einer kleinen Demo-Applikation, welche die Visual Studio Tools for Office 3.0 vorstellen soll. Dabei bin ich auf ein (in VB) kleines Beispiel in der MSDN Library gestoßen, welches die Stärke von Visual Basic in der Office Entwicklung klar aufzeigt. Das Problem von C# ist nämlich, das optionale Parameter nicht vorhanden sind.

Das Beispiel führt eine Rechtschreibkontrolle durch. Dabei benötigt man in Visual Basic ca. 5 Zeilen. In C# wird das mit 12 optionalen Parametern, welche jeweils mit "ref missing" angegeben wird doch ziemlich umfangreich.

Das ganze kann man am unteren Ende des Artikels in der MSDN nachlesen:

http://msdn2.microsoft.com/de-de/library/ms178794.aspx

Anmerkung:

bin stark für C#. VSTO Entwickle ich jedoch mit Visual Basic. Für viele andere Dinge verwende ich auch C#

Mix08: Silverlight 2.0 Beta steht in den Startlöchern

In den letzten Stunden herrschte ziemliche Aktivität in den Blogs von Silverlight.net - dies darauf zu schließen das Silverlight 2.0 Beta 1 demnächst erscheinen soll. Morgen beginnt die Mix. In der Keynote wird bestimmt nicht auf Silverlight verzichtet.

In der Zwischenzeit gibt es hier bereits einige Controls: http://michaelsync.net/2008/01/09/opensource-silverlight-20-controls-and-how-to-use-them

Ferner gibt es auf dem Silverlight-Blog einige Infos: http://geekswithblogs.net/lbugnion/archive/2008/03/04/mix08-random-pieces-of-news-3.aspx

Also, warten wir gespannt auf die neue Version ;)

Nokia mit Silverlight

Nokia wird in Zukunft das Silverlight Mobile Plugin unterstützen. Dadurch ist es nun möglich Silverlight Applikationen für Mobile Geräte zu schreiben. Näheres dazu wird auf der ab 05.03.2008 stattfindenden Konferenz Mix verkündet werden. Unterstützt werden Series40 und Series60 Geräte.

http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/03/04/Nokia-Signs-up-for-Silverlight-Mobile.aspx

Academic Community Launch Österreich: Visual Studio 2008, SQL Server 2008 und C# 3.0

Im März und April 2008 wird an Österreichs Universitäten ein Community Launch statt finden, welcher die Themen Visual Studio 2008, SQL und C# 3.0 behandelt. Das ganze ist kostenlos!

Das Programm:

VORTRAG: VISUAL STUDIO 2008

Dieser Vortrag richtet sich speziell an die Neuerungen in Visual Studio 2008. Hierbei wird auf neue Sprachfeatures von C# ebenso wie auf den WPF-Designer eingegangen. Ferner wird ein Demo zur Web-Entwicklung mit Visual Studio 2008 gezeigt, welches die neuen JavaScript und Ajax Erweiterungen zeigt. Auch der Sektor der Business Applications wird mit den Visual Studio Tools for Office abgedeckt. Schlussendlich wird noch ein Beispiel für die neue Technologie „Silverlight“ gezeigt.

VORTRAG: DATA AND MORE

Die neue Generation an Entwicklertools bietet eine Reihe von neuen Datenbezogene Features, die dem Entwickler das Leben leichter machen. Dieser Vortrag gibt eine Einführung in die Welt von LINQ, die SQL Server Familie und verwandte Technologien wie ASP.net Entity Framework.

.NET 3.5 WORKSHOP

Dieser Vortrag ist interatkiv gestaltet und wird die Neuerungen in .NET 3.5 anhand von Beispielen aufzeigen. Die Beispiele hängen auch vom Interesse der Hörer ab, so wird besonders auf deren Bedürfnisse eingegangen. Im Generellen sollten jedoch folgende Punkte abgedeckt werden:

LINQ: Interner Aufbau (wie kann man selbst einen Provider schreiben?) und Verwendung in eigenen Applikationen

  • Lambda Expressions
  • Anonyme Typen
  • Partielle Methoden
  • Automatische Properties
  • Member Type initialization
  • Collection Initialisierungen
  • Extension Methods
  • XML Erweiterungen für Visual Basic .NET

 

Die Termine:

07.03.2008
Universität Salzburg
H 0.1
10:00 - 14:00

09.04.2008
Universität Linz
(Raum wird noch bekannt gegeben)
16:00 - 20:00

10.04.2008
Fachhochschule Hagenberg
(wird noch bekannt gegeben)
16:00 - 20:00

11.04.2008
Universität Innsbruck
(wird noch bekannt gegeben)
12:00 - 16:00

15.04.2008
Technische Universität Wien
(wird noch bekannt gegeben)
(n.v.)

16.04.2008
Fachhochschule Technikum Wien
(wird noch bekannt gegeben)
(n.v.)

21.04.2008
Technische Universität Graz
(wird noch bekannt gegeben)
(n.v.)

22.04.2008
Universität Klagenfurt
(wird noch bekannt gegeben)
(n.v.)

24.04.2008
Fachhochschule Salzburg
(wird noch bekannt gegeben)
16:00 - 20:00

Visual Basic 9 Tutorials mit XML

Auf dem Blog des österreichischen Student Partners und C# MVP's Christian Liensberger finden sich neue Tutorials für Visual Basic 9. Es werden viele

Themen, wie XML, XML literals, XPath, UI, business objects, design pattern, events, exception handling in VB, File access... gestreift.

Also: Rein schaun lohnt sich!

Part 1: http://www.liensberger.it/web/blog/?p=245
Part 2: http://www.liensberger.it/web/blog/?p=251
Part 3: http://www.liensberger.it/web/blog/?p=265
Part 4: http://www.liensberger.it/web/blog/?p=272