alexanderzeitler.com - WCF Web APIs / WCF Http mit ASP.NET Forms Authentication verwenden









Search Preview

WCF Web APIs / WCF Http mit ASP.NET Forms Authentication verwenden | Alexander Zeitler

alexanderzeitler.com

.com > alexanderzeitler.com

SEO audit: Content analysis

Language Error! No language localisation is found.
Title WCF Web APIs / WCF Http mit ASP.NET Forms Authentication verwenden | Alexander Zeitler
Text / HTML ratio 70 %
Frame Excellent! The website does not use iFrame solutions.
Flash Excellent! The website does not have any flash contents.
Keywords cloud = die public Die WCF der den für string ASPNET werden wie var zu wird ist und return Der aus
Keywords consistency
Keyword Content Title Description Headings
= 39
die 32
public 18
Die 17
WCF 12
der 12
Headings
H1 H2 H3 H4 H5 H6
1 3 0 0 0 0
Images We found 4 images on this web page.

SEO Keywords (Single)

Keyword Occurrence Density
= 39 1.95 %
die 32 1.60 %
public 18 0.90 %
Die 17 0.85 %
WCF 12 0.60 %
der 12 0.60 %
den 11 0.55 %
für 9 0.45 %
string 8 0.40 %
ASPNET 8 0.40 %
werden 8 0.40 %
wie 7 0.35 %
var 7 0.35 %
zu 7 0.35 %
wird 7 0.35 %
ist 7 0.35 %
und 7 0.35 %
return 6 0.30 %
Der 6 0.30 %
aus 6 0.30 %

SEO Keywords (Two Word)

Keyword Occurrence Density
= new 10 0.50 %
für die 6 0.30 %
wie folgt 5 0.25 %
in der 5 0.25 %
WCF Http 5 0.25 %
public class 5 0.25 %
folgt aus 4 0.20 %
die ASPNET 4 0.20 %
ASPNET MVC 3 0.15 %
mit den 3 0.15 %
WCF HTTP 3 0.15 %
Damit die 3 0.15 %
Forms Authentication 3 0.15 %
sieht wie 3 0.15 %
public void 3 0.15 %
public ActionResult 3 0.15 %
sollen die 2 0.10 %
2 0.10 %
die RESTful 2 0.10 %
2 0.10 %

SEO Keywords (Three Word)

Keyword Occurrence Density Possible Spam
wie folgt aus 4 0.20 % No
sieht wie folgt 3 0.15 % No
ASPNET MVC 3 2 0.10 % No
return View public 2 0.10 % No
aus public class 2 0.10 % No
WCF Http APIs 2 0.10 % No
View public ActionResult 2 0.10 % No
MVC 3 Website 2 0.10 % No
in der Klasse 2 0.10 % No
die RESTful Services 2 0.10 % No
Username und Password 2 0.10 % No
new controller = 2 0.10 % No
sollen die RESTful 2 0.10 % No
2 0.10 % No
users=> 2 0.10 % No
2 0.10 % No
folgt aus public 2 0.10 % No
Service in der 2 0.10 % No
processors MediaTypeProcessorMode mode 2 0.10 % No
mode processorsAddnew JsonProcessoroperationmode 2 0.10 % No

SEO Keywords (Four Word)

Keyword Occurrence Density Possible Spam
sieht wie folgt aus 3 0.15 % No
operation IList processors MediaTypeProcessorMode 2 0.10 % No
Service in der Klasse 2 0.10 % No
users=> 2 0.10 % No
sollen die RESTful Services 2 0.10 % No
MediaTypeProcessorMode mode processorsAddnew JsonProcessoroperationmode 2 0.10 % No
folgt aus public class 2 0.10 % No
IList processors MediaTypeProcessorMode mode 2 0.10 % No
processors MediaTypeProcessorMode mode processorsAddnew 2 0.10 % No
return View public ActionResult 2 0.10 % No
ASPNET MVC 3 Website 2 0.10 % No
wie folgt aus public 2 0.10 % No
1 0.05 % No
Die FormsAuthentication wird 1 0.05 % No
path=login> 1 0.05 % No
1 0.05 % No
aus public class AccountController 1 0.05 % No
loginUrl=~AccountLogOn timeout=2880 name=ASPXFORMSAUTH > 1 0.05 % No
1 0.05 % No
1 0.05 % No

Internal links in - alexanderzeitler.com

Fixing Chrome 58+ [missing_subjectAltName] with openssl when using self signed certificates
Fixing Chrome 58+ [missing_subjectAltName] with openssl when using self signed certificates | Alexander Zeitler
Accessing an HTTP API running on your MacBook in a Docker container from your iPhone/iPad using dnsmasq
Accessing an HTTP API running on your MacBook in a Docker container from your iPhone/iPad using dnsmasq | Alexander Zeitler
Deploying Ubuntu Mate Desktop as a developer environment in a Azure VM
Deploying Ubuntu Mate Desktop as a developer environment in a Azure VM | Alexander Zeitler
Deploying Ubuntu Mate Desktop as a developer environment in AWS EC2
Deploying Ubuntu Mate Desktop as a developer environment in AWS EC2 | Alexander Zeitler
Debugging mocha tests in a Docker container using Visual Studio Code
Debugging mocha tests in a Docker container using Visual Studio Code | Alexander Zeitler
Debugging mocha tests with Visual Studio Code when Node.js is installed using nvm
Debugging mocha tests with Visual Studio Code when Node.js is installed using nvm | Alexander Zeitler
Debugging a ES6 Node.js application in a Docker container using Visual Studio Code
Debugging a ES6 Node.js application in a Docker container using Visual Studio Code | Alexander Zeitler
Some thoughts on Open Source Software
Some thoughts on Open Source Software | Alexander Zeitler
Resizing a VMware Workstation VM partition using GParted - get the swap partition out of my way!
Resizing a VMware Workstation VM partition using GParted - get the swap partition out of my way! | Alexander Zeitler
Workflows: using Docker Machine and Docker Compose together in development
Workflows: using Docker Machine and Docker Compose together in development | Alexander Zeitler
Chrome crashes on Ubuntu in VMware Workstation
Chrome crashes on Ubuntu in VMware Workstation | Alexander Zeitler
Rename Visual Studio project including files, folders and namespaces
Rename Visual Studio project including files, folders and namespaces | Alexander Zeitler
A lap around AWS and docker-machine
A lap around AWS and docker-machine | Alexander Zeitler
Integration-testing ASP.NET 5 / MVC 6 Controllers on DNX Beta 4
Integration-testing ASP.NET 5 / MVC 6 Controllers on DNX Beta 4 | Alexander Zeitler
Deploying a ASP.NET MVC 6 API as Azure API App in Azure App Services
Deploying a ASP.NET MVC 6 API as Azure API App in Azure App Services | Alexander Zeitler
lowerCamelCase JSON with ASP.NET MVC 6
lowerCamelCase JSON with ASP.NET MVC 6 | Alexander Zeitler
Running ASP.NET 5 Beta 4 in Docker with DNX runtime #aspnet5 #docker
Running ASP.NET 5 Beta 4 in Docker with DNX runtime #aspnet5 #docker | Alexander Zeitler
Stop complaining or improve yourself
Stop complaining or improve yourself | Alexander Zeitler
#NodeJS / #ExpressJS: Adding routes dynamically at runtime
#NodeJS / #ExpressJS: Adding routes dynamically at runtime | Alexander Zeitler
mongoose: Referencing schema in properties or arrays
mongoose: Referencing schema in properties or arrays | Alexander Zeitler
MongoDB development environment journal size management using mongoctl
MongoDB development environment journal size management using mongoctl | Alexander Zeitler
Farewell...
Farewell... | Alexander Zeitler
Inspecting AngularJS $scope using Firebug and Chrome Developer Tools
Inspecting AngularJS $scope using Firebug and Chrome Developer Tools | Alexander Zeitler
Useful @Brackets extensions for Web Developers
Useful @Brackets extensions for Web Developers | Alexander Zeitler
.NET User Group Karlsruhe: StreamInsight: Complex Event Processing by Microsoft
.NET User Group Karlsruhe: StreamInsight: Complex Event Processing by Microsoft | Alexander Zeitler
“Commit all must be called when a managed buffer has focus” in Microsoft SQL Server Data Tools
“Commit all must be called when a managed buffer has focus” in Microsoft SQL Server Data Tools | Alexander Zeitler
.NET User Group Karlsruhe: Git
.NET User Group Karlsruhe: Git | Alexander Zeitler
Open Source Windows 8 App: Sprudelsuche
Open Source Windows 8 App: Sprudelsuche | Alexander Zeitler
Open Source– Scheissegal?
Open Source– Scheissegal? | Alexander Zeitler
Lowercase JSON with ASP.NET Web API
Lowercase JSON with ASP.NET Web API | Alexander Zeitler
.NET Usergroup Karlsruhe: Think Big – Entwicklung skalierbarer Anwendungen mit Windows Azure
.NET Usergroup Karlsruhe: Think Big – Entwicklung skalierbarer Anwendungen mit Windows Azure | Alexander Zeitler
ASP.NET Web API and RavenDb
ASP.NET Web API and RavenDb | Alexander Zeitler
ASP.NET Web API Round-Up Slides
ASP.NET Web API Round-Up Slides | Alexander Zeitler
ASP.NET MVC 4 public beta including ASP.NET Web API
ASP.NET MVC 4 public beta including ASP.NET Web API | Alexander Zeitler
Hash Bang Urls in Single Page Applications mit ASP.NET MVC
Hash Bang Urls in Single Page Applications mit ASP.NET MVC | Alexander Zeitler
.NET User Group Karlsruhe: Know your Tools
.NET User Group Karlsruhe: Know your Tools | Alexander Zeitler
Git flow init liefert: flags: FATAL unable to determine getopt version unter Cygwin
Git flow init liefert: flags: FATAL unable to determine getopt version unter Cygwin | Alexander Zeitler
Using JsonValue and JsonArray in WCF Web API
Using JsonValue and JsonArray in WCF Web API | Alexander Zeitler
.NET User Group Karlsruhe: PowerShell 3.. 2.. 1..
.NET User Group Karlsruhe: PowerShell 3.. 2.. 1.. | Alexander Zeitler
What’s new in WCF Web API Preview 5 – introducing the test client
What’s new in WCF Web API Preview 5 – introducing the test client | Alexander Zeitler
Externe Templates in KnockoutJS laden
Externe Templates in KnockoutJS laden | Alexander Zeitler
WCF Web API: Role based access control with basic authentication
WCF Web API: Role based access control with basic authentication | Alexander Zeitler
.NET User Group Karlsruhe: Produce Cleaner Code with Aspect-Oriented Programming (AOP)
.NET User Group Karlsruhe: Produce Cleaner Code with Aspect-Oriented Programming (AOP) | Alexander Zeitler
REST using the WCF Web API – POST it!
REST using the WCF Web API – POST it! | Alexander Zeitler
REST using the WCF Web API – getting more RESTful responses (Part 5)
REST using the WCF Web API – getting more RESTful responses (Part 5) | Alexander Zeitler
TypeLoadException when mocking COM objects - Could not load type … from assembly. The type is marked…
TypeLoadException when mocking COM objects - Could not load type … from assembly. The type is marked… | Alexander Zeitler
REST using the WCF Web API – getting RESTful the BDD way (Part 4)
REST using the WCF Web API – getting RESTful the BDD way (Part 4) | Alexander Zeitler
REST using the WCF Web API – refactoring to IoC style (Part 3)
REST using the WCF Web API – refactoring to IoC style (Part 3) | Alexander Zeitler
REST using the WCF Web API – Basics (Part2)
REST using the WCF Web API – Basics (Part2) | Alexander Zeitler
Microsoft Web API – the REST is done by WCF (Part 1)
Microsoft Web API – the REST is done by WCF (Part 1) | Alexander Zeitler
Microsoft Web API – den REST macht WCF (Teil 1)
Microsoft Web API – den REST macht WCF (Teil 1) | Alexander Zeitler
.NET User Group Karlsruhe: Flexible Softwarearchitekturen mit Inversion of Control (IoC)
.NET User Group Karlsruhe: Flexible Softwarearchitekturen mit Inversion of Control (IoC) | Alexander Zeitler
machine.fakes ReSharper Templates
machine.fakes ReSharper Templates | Alexander Zeitler
CreateCert.cmd aus dem Windows Azure Platform Training Kit funktioniert nicht
CreateCert.cmd aus dem Windows Azure Platform Training Kit funktioniert nicht | Alexander Zeitler
JSON via jQuery direkt an einen ASP.NET MVC 3 Controller senden
JSON via jQuery direkt an einen ASP.NET MVC 3 Controller senden | Alexander Zeitler
POSTing Json data using the HttpClient from WCF Web API
POSTing Json data using the HttpClient from WCF Web API | Alexander Zeitler
Using the new WCF Web APIs HttpClient with ASP.NET Forms Authentication
Using the new WCF Web APIs HttpClient with ASP.NET Forms Authentication | Alexander Zeitler
Keyboard Jedi unter x64
Keyboard Jedi unter x64 | Alexander Zeitler
Using WCF Web APIs / WCF Http with ASP.NET Forms Authentication
Using WCF Web APIs / WCF Http with ASP.NET Forms Authentication | Alexander Zeitler
WCF Web APIs / WCF Http mit ASP.NET Forms Authentication verwenden
WCF Web APIs / WCF Http mit ASP.NET Forms Authentication verwenden | Alexander Zeitler
ILSpy – Open Source .NET Assembly Browser und Decompiler
ILSpy – Open Source .NET Assembly Browser und Decompiler | Alexander Zeitler

Alexanderzeitler.com Spined HTML


WCF Web APIs / WCF Http mit ASP.NET Forms Authentication verwenden | Alexander Zeitler Toggle navigation Home Feed WCF Web APIs / WCF Http mit ASP.NET Forms Authentication verwenden Written on March 02, 2011 Seit einiger Zeit arbeitet Microsoft daran, WCF z.B. für die Verwendung in RESTful Szenarien zu vereinfachen. Die neuen WCF Http APIs ermöglichen ein einfacheres Hosting der WCF-Services in (bestehenden) ASP.NET (MVC) Websites ohne den von WCF bisher bekannten Konfigurationsaufwand. In den aktuellen Builds ist allerdings die Unterstützung für Authentifzierung und Authorisierung noch nicht wirklich vorhanden. Geplant ist z.B. die Unterstützung von OAuth. Allerdings habe ich mir die Frage gestellt, warum man nicht Bewährtes, wie z.B. die ASP.NET Forms Authentication wiederverwendet. Nach einigen Versuchen bin ich für mich zu einer brauchbaren Lösung gekommen, die ich hier vorstellen möchte. Requirements Folgende Anforderungen habe ich an die Authentifizierung gestellt: Forms Authentifizierung sowohl für die ASP.NET MVC 3 Website als auch für die darin gehosteten WCF Http Services Die RESTful Authentifizierung soll keine Login-Formulare ausfüllen, sondern mit den Forms Authentication Credentials gegen einen WCF Http Authentication Service funktionieren Im Browser sollen die RESTful Services XML liefern An den Console Test Client sollen die RESTful Services JSON liefern Umsetzung -- Host Die vorgestellte Lösung basiert auf den WCF Web APIs Preview 3. Zunächst wird eine leere ASP.NET MVC 3 Website erstellt. XML liefern die WCF Http APIs automatisch zurück. Um JSON ausgeben zu können, wird ein sog. JsonProcessor benötigt, der bereits in den APIs enthalten ist. Um Formulareingaben verarbeiten zu können, muss ein FormUrlEncodedProcessor verwendet werden, der ebenfalls bereits vorhanden ist. Damit ergibt sich folgende Konfiguration für unsere Services: public matriculation ContactManagerConfiguration : HttpHostConfiguration, IProcessorProvider { private readonly CompositionContainer _container; public ContactManagerConfiguration(CompositionContainer container) { _container = container; } public void RegisterRequestProcessorsForOperation(HttpOperationDescription operation, IList<Processor> processors, MediaTypeProcessorMode mode) { processors.Add(new JsonProcessor(operation,mode)); processors.Add(new FormUrlEncodedProcessor(operation,mode)); } public void RegisterResponseProcessorsForOperation(HttpOperationDescription operation, IList<Processor> processors, MediaTypeProcessorMode mode) { processors.Add(new JsonProcessor(operation,mode)); } public object GetInstance(Type serviceType, InstanceContext instanceContext, Message message) { var contract = AttributedModelServices.GetContractName(serviceType); var identity = AttributedModelServices.GetTypeIdentity(serviceType); var definition = new ContractBasedImportDefinition(contract, identity, null, ImportCardinality.ExactlyOne, false, false, CreationPolicy.NonShared); return _container.GetExports(definition).First().Value; } } Wir erstellen zwei Services: Contact Service, in der Klasse ContactResource Login Service, in der Klasse LoginResource Die Implementierungen werden weiter unten vorgestellt. Die Registrierung der Services erfolgt in der Global.asax.cs Für die Registrierung von sog. ServiceRoutes wurde eine Extension Method AddServiceRoute() eingeführt. Die Registrierung sieht dann wie folgt aus: var itemize = new AssemblyCatalog(typeof(Global).Assembly); var container = new CompositionContainer(catalog); var configuration = new ContactManagerConfiguration(container); RouteTable.Routes.AddServiceRoute<ContactResource>("contact", configuration); RouteTable.Routes.AddServiceRoute<LoginResource>("login", configuration); Damit die ServiceRouten von WCF HTTP und die normalen MVC Routen parallel funktionieren, müssen für die MVC-Routen die WCF HTTP Routen ausgefiltert werden, was mittels einer IRouteConstraint funktioniert: public matriculation WcfRoutesConstraint : IRouteConstraint { public WcfRoutesConstraint(params string[] values) { this._values = values; } private string[] _values; public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { // Get the value tabbed "parameterName" from the // RouteValueDictionary tabbed "value" string value = values[parameterName].ToString(); // Return true is the list of unliable values contains // this value. bool match = !_values.Contains(value); return match; } } Die WcfRouteConstraint wird in der MVC MapRoute-Definintion übergeben: routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", whoopee = "Index", id = UrlParameter.Optional }, // Parameter defaults new { controller = new WcfRoutesConstraint(new string[] {"contact","login"}) } ); Die ContactResource sieht wie folgt aus - der Einfachheit wegen ohne Datenbankzugriff o.ä.: [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] [ServiceContract] [Export] public matriculation ContactResource { [ImportingConstructor] public ContactResource() { } [WebGet(UriTemplate="{id}")] public ContactDto Get(string id, HttpResponseMessage responseMessage) { var contact = new ContactDto { Name = "Alexander Zeitler" }; return contact; } } Die LoginResource sieht wie folgt aus: [ServiceContract] [Export] public matriculation LoginResource { [ImportingConstructor] public LoginResource() { } [WebInvoke(UriTemplate="", Method = "POST")] public void Login(Credentials credentials, HttpResponseMessage responseMessage) { bool auth = Membership.ValidateUser(credentials.Username, credentials.Password); if (auth) { FormsAuthentication.SetAuthCookie(credentials.Username,true); } else { responseMessage.StatusCode = HttpStatusCode.Unauthorized; } } } Die Funktion ist schnell erklärt: Über einen selbst implementierten Credentials Parameter mit den Properties Username und Password kommen die Login-Daten des Users per POST-Methode in den Service. Diese werden gegen die ASP.NET Membership Datenbank authentifiziert und im Erfolgsfall wird das ASP.NET FormsAuthentication Cookie zurückgeliefert. Im Fehlerfall wird ein HTTP Error 401 Unauthorized zurückgegeben. Damit die ASP.NET FormsAuthentication funktioniert, sind in der web.config einige Einstellungen vorzunehmen. Zunächst müssen die zu schützenden URLs für die nicht authentifizierten User gesperrt werden. Der Login-Service muss allen Usern zugänglich sein: <location path=""> <system.web> <authorization> <allow roles="Admins"/> <deny users="*"/> </authorization> </system.web> </location> <location path="login"> <system.web> <authorization> <allow users="*"/> </authorization> </system.web> </location> Die FormsAuthentication wird wie folgt konfiguriert: <authentication mode="Forms"> <forms loginUrl="~/Account/LogOn" timeout="2880" name=".ASPXFORMSAUTH" /> </authentication> Der Account-Controller sieht wie folgt aus: public matriculation AccountController : Controller { [HttpGet] public ActionResult Logon() { Response.StatusCode = (int)HttpStatusCode.Unauthorized; return View(); } [HttpPost] public ActionResult Logon(string username, string password) { if(Membership.ValidateUser(username, password)) { FormsAuthentication.SetAuthCookie(username,true); } return View(); } public ActionResult LogOff() { FormsAuthentication.SignOut(); return RedirectToAction("Logon", "Account"); } } Die parameterloseWhoopee"Logon" dient dazu, nichtauthentifizierte Aufrufe der RESTful Clients zu blocken. Die Post-Variante dient für die normale Formular-Authentifizierung im Browser. Die LogOffWhoopeeist selbsterklärend... Die zugehörige Logon-View besteht aus einem Formular mit den beiden Eingabefeldern Username und Password soweit einem Button und einem Link auf die Abmelde-Action. Umsetzung Client Der Client besteht aus zwei Funktionen: Authentifzierung Kontaktdaten lesen Die Authentifzierung erfolgt mittels HttpWebRequest: HttpWebRequest loginRequest = (HttpWebRequest)HttpWebRequest.Create("http://localhost:44857/login"); loginRequest.Method = "POST"; CookieContainer cookieContainer = new CookieContainer(); loginRequest.CookieContainer = cookieContainer; loginRequest.ContentType = "application/x-www-form-urlencoded"; ASCIIEncoding encoding = new ASCIIEncoding(); string postData = "Username=foo&Password=bar"; byte[] data = encoding.GetBytes(postData); loginRequest.ContentLength = postData.Length; Stream dataStream = loginRequest.GetRequestStream(); dataStream.Write(data, 0, data.Length); dataStream.Close(); loginRequest.GetResponse(); Wichtig ist das Setzen des ContentTypes sowie die Verwendung des CookieContainers. Der CookieContainer speichert nach dem Aufruf von loginRequest.GetResponse() die vom Server erhaltenen Cookies. Nach erfolgreicher Authentifizierung können die Daten vom Kontakt-Service geladen werden. Damit die Formular-Authentifizerung die Requests an den geschützten Kontakt-Service weiterreicht, muss das oben erhaltene Cookie mit übergeben werden, was man durch die Wiederverwendung des CookieContainers erreicht: HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost:44857/contact/1"); request.CookieContainer = cookieContainer; request.Accept = "application/json"; request.Method = "GET"; try { HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader reader = new StreamReader(responseStream, Encoding.UTF8); string result = reader.ReadToEnd(); JavaScriptSerializer jsonDeserializer = new JavaScriptSerializer(); ContactDto contact = jsonDeserializer.Deserialize<ContactDto>(result); Console.WriteLine(contact.Name); Console.ReadLine(); } reservation (WebException e) { Console.WriteLine(((HttpWebResponse)e.Response).StatusCode); Console.ReadLine(); } Der Aufruf im Browser liefert nach erfolgter Authentifizierung das gewünschte XML zurück: Der Client liefert das deserialisierte JSON zurück: Bei erfolgloser oder fehlender Authentifizierung wird der entsprechende StatusCode zurückgeliefert: Bitte beachtet, dass ich ein Update gepostet habe, das den neuen HttpClient verwendet. Damit sind die zu Beginn gestellten Forderungen implementiert. Ebenso wie die in einem frühen Stadium vorliegenden WCF HTTP APIs erhebt diese Lösung keinen Anspruch auf vollständige Funktion und soll auch als Diskussionsgrundlage dienen. Die Beispiel-Implementierung kann hier heruntergeladen werden: WcfHttpMvcAuth.zip (9.45 mb) Please enable JavaScript to view the comments powered by Disqus. Copyright © Alexander Zeitler 2003 - 2016 | Impressum