<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Katrien's MSDN Blog</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/katriend/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/katriend/feed.xml</link>
    <description />
    <lastBuildDate>Tue, 16 Apr 2019 05:16:09 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Azure ARM template for Cool Storage</title>
      <link>https://docs.microsoft.com/archive/blogs/katriend/azure-arm-template-for-cool-storage</link>
      <pubDate>Sun, 29 May 2016 13:26:53 GMT</pubDate>
      <dc:creator><![CDATA[Katrien DG]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/katriend/?p=4026</guid>
      <description><![CDATA[Azure Cool Blob Storage has been made available a few weeks ago. With this new type of Azure Storage...]]></description>
      <content:encoded><![CDATA[Azure <a href="https://azure.microsoft.com/en-us/blog/introducing-azure-cool-storage/" target="_blank">Cool Blob Storage</a> has been made available a few weeks ago. With this new type of Azure Storage account, you can store your cool objects at a lower price than typical hot data while still being able to use the same performance in accessing the data when needed.

I wanted to have my Azure Resource Manager template leverage this new storage tier, so I looked up details on the latest version of the REST API and ARM schema. The BlobStorage account with the access level of Hot or Cool is supported if you are using schema version 2016-01-01 (or later when applicable).
Check out the details for the latest API version: <a href="https://msdn.microsoft.com/en-us/library/azure/mt163553.aspx" target="_blank">https://msdn.microsoft.com/en-us/library/azure/mt163553.aspx</a>, or more in detail the Github commit for this version: <a href="https://github.com/Azure/azure-rest-api-specs/blob/master/arm-storage/2016-01-01/swagger/storage.json">https://github.com/Azure/azure-rest-api-specs/blob/master/arm-storage/2016-01-01/swagger/storage.json</a>

Here's an ARM template that creates a Blob storage account of type Cool (or Hot), depending on the parameters your specify:
<script src="https://gist.github.com/katriendg/313122c00efcb4af1b6dc7a31ce95bee.js"></script>

&nbsp;

If you're like me I typically use the <a href="https://resources.azure.com/">Azure Resource Explorer</a> a lot to review and update my resources. Unfortunately the Resource Explorer does not by default use the newest schema for Storage so you won't see the Sku, AccessType and Kind properties that are needed. Instead you can use a tool like Fiddler or Postman to get your resource and validate the properties.

HTTP GET for details for your storage account:

<em>https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{accountName}?api-version={api-version}</em>

In order to call the Azure REST API you must supply the access token. One way of getting this one for local testing is to use the <a href="https://github.com/projectkudu/ARMClient" target="_blank">ARMClient </a>tool (if you're on Windows). It's a command line tool that will copy the token to the clipboard with this call:

ARMClient.exe token [tenant|subscription]

With this info you can now send the request through Postman and add your authorization header.

&nbsp;

<a href="https://msdnshared.blob.core.windows.net/media/2016/05/postmancool1.png"><img class="alignnone size-medium wp-image-4045" src="https://msdnshared.blob.core.windows.net/media/2016/05/postmancool1-300x85.png" alt="Postman" width="300" height="85" /></a>

&nbsp;

&nbsp;

&nbsp;

&nbsp;

&nbsp;]]></content:encoded>
    </item>
    <item>
      <title>Using the Azure API Management REST API as workaround to RBAC functionality</title>
      <link>https://docs.microsoft.com/archive/blogs/katriend/using-the-azure-api-management-rest-api-as-workaround-to-rbac-functionality</link>
      <pubDate>Mon, 21 Dec 2015 05:16:00 GMT</pubDate>
      <dc:creator><![CDATA[Katrien DG]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/katriend/2015/12/21/using-the-azure-api-management-rest-api-as-workaround-to-rbac-functionality/</guid>
      <description><![CDATA[If you are using Azure API Management today, you might have noticed the service is only available in...]]></description>
      <content:encoded><![CDATA[<p>If you are using <a href="https://azure.microsoft.com/en-us/documentation/services/api-management/">Azure API Management</a> today, you might have noticed the service is only available in the previous Azure management portal. While support in the newly GA&rsquo;s portal is coming, this does mean that one of the features that the new portal exposes, namely Role Based Access Control (RBAC) is not yet available. <br />While working on a recent API Management implementation at a customer, they were looking to activate RBAC so that their admin users for the API Management service would not require any admin rights on the Azure portal itself. API Management contains a concept of Publisher Portal, which is where the admins do their work of customizing the exposed APIs.<br />First reaction was to explain to the customer that they would have to wait for this feature to become available. But after a discussion with my colleagues in the product team, they explained a workaround that would enable me to help the customer right away. It just requires leveraging the REST API and a little coding to get the job done.<br />Azure API Management has a <a href="https://msdn.microsoft.com/en-us/library/azure/dn776326.aspx">REST API</a> to do administrative tasks. This API exposes things like the Tenant, Users and Groups, Products, Reports and more. It is there to help you automate parts of your API Management tenant configuration and working. One of the entities that are exposed through the REST API is a <a href="https://msdn.microsoft.com/en-us/library/azure/dn776330.aspx">User</a>. Within this entity, there is one very interesting method to help us with our problem, namely <a href="https://msdn.microsoft.com/en-us/library/azure/dn776330.aspx#SSO">generateSsoUrl</a>.</p>
<p>Let&rsquo;s review that. According to the documentation:</p>
<p style="padding-left: 30px;"><em>This operation retrieves a redirection URL containing an authentication token for signing a given user into the developer portal.</em></p>
<p>The above actually also applies to the Publisher portal, which can use the same access token, however the user for which you need the token needs to be an admin user. This is done by leveraging the <em>User ID 1</em>. The API Management setup this concept of user <strong>1</strong> being the <strong>admin</strong>, because they wanted something simple to bridge between now and the moment RABC will be baked in. So, exactly what we need!</p>
<h3>Setting up our RBAC workaround</h3>
<p>Here&rsquo;s the tasks we will execute to get this working:<br />1.&nbsp;Configure Azure API management account to enable the REST API and setup the access token.<br />2.&nbsp;Setup a development environment with Visual Studio 2015 and Azure SDK 2.8.<br />3.&nbsp;You need Admin access to your Azure subscription, and make sure you have service administrator level to the Azure AD domain you want to use.<br />4.&nbsp;Create a web app (ASP.NET) that validates whether the current user is member of a pre-defined Azure AD group. If yes: generate a Login link with an access token to the Azure API Management account.<br />5.&nbsp;Deploy the application to Azure, to an App Service Web App.<br />6.&nbsp;Leverage or create a custom Azure AD group to hold the members with Admin rights to the Azure API management account.<br />7.&nbsp;Setup Authorization/Authentication feature in the Azure Web App to validate the user.</p>
<h2>Configure Azure API Management account</h2>
<p>In this portion, we assume you already have an account created. Go to the publisher portal of your account, browse to Security and activate Enable API Management REST API checkbox. Wait for a confirmation the action is successful.</p>
<p>Now configure and make a note of the access token. Scroll to the bottom of the page and configure an expiry date for your token. For testing, choose at least a date later than today. This token can later be changed, just make sure it is then copied to the App settings if that happens.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/8738.blog-apim01.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/8738.blog_2D00_apim01.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/8738.blog-apim01.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/8738.blog_2D00_apim01.png" alt="" border="0" /></a></p>
<p>&nbsp;Write down the SharedAccessSignature as we&rsquo;ll need it later. You won&rsquo;t be able to see it once you leave this page.</p>
<h3>Azure AD: Retrieving the right Group ID</h3>
<p>This step can also be done at the end, but if you want to have more settings automated through the ARM resource deployment, then get the ID for your group before creating the first deployment.<br />Navigate to your Azure AD using the Azure Management Portal, click Groups. Go to the Configure tab and copy the Object ID. You will need this ID in the deployment step. If you skipped this step in Visual Studio, you can still edit its value through the Web App&rsquo;s Application Settings pane.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/3463.blog-apim01-1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/3463.blog_2D00_apim01_2D00_1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/3463.blog-apim01-1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/3463.blog_2D00_apim01_2D00_1.png" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<p>For this setup to function, you need to make sure your test users are actually members of the Group above.</p>
<h2>Creating the ASP.NET Web app</h2>
<p>We&rsquo;ll use ASP.NET app with just one page that shows a login box for entitled users, and a default message for those that are not. You can review the sample code in <a href="https://github.com/katriendg/sample-azure-apim-ssourl">this GitHub repo</a>.</p>
<p>Nothing of a sophisticated web app, just something to get the point across in this post.</p>
<p>A few elements relevant to review:</p>
<p style="padding-left: 30px;">[<span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">Authorize</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">]</span></span>&nbsp;</p>
<p style="padding-left: 30px;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">public </span></span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">class </span></span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">HomeController</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> : </span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">Controller</span></span></span></p>
<p>We leverage the <a href="https://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute(v=vs.118).aspx">Authorize</a> attribute to make sure the page does not process without the user being authenticated.</p>
<p>Next, a utility class is used to interact with the API Management REST API, and use the <em>generateSsoUrl</em> action.</p>
<p>string</p>
<p><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">requestUrl = </span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">string</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">.Format(</span></span><span style="color: #a31515; font-family: Consolas; font-size: x-small;"><span style="color: #a31515; font-family: Consolas; font-size: x-small;"><span style="color: #a31515; font-family: Consolas; font-size: x-small;">"{0}/users/{1}/generateSsoUrl?api-version={2}"</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">, baseUrl, </span></span><span style="color: #a31515; font-family: Consolas; font-size: x-small;"><span style="color: #a31515; font-family: Consolas; font-size: x-small;"><span style="color: #a31515; font-family: Consolas; font-size: x-small;">"1"</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">, API_VERSION);</span></span></p>
<p><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">using</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> (</span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">HttpClient</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> httpClient = </span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">new</span></span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">HttpClient</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">())</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">var</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> request = </span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">new </span></span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">HttpRequestMessage</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">(</span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">HttpMethod</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">.Post, requestUrl);</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.Headers.Authorization =&nbsp;<span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">new </span></span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">AuthenticationHeaderValue</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">(</span></span><span style="color: #a31515; font-family: Consolas; font-size: x-small;"><span style="color: #a31515; font-family: Consolas; font-size: x-small;"><span style="color: #a31515; font-family: Consolas; font-size: x-small;">"SharedAccessSignature"</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">, sharedAccessSignature);</span></span></p>
<p style="padding-left: 30px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">HttpResponseMessage</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> response = </span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">await</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> httpClient.SendAsync(request);</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.EnsureSuccessStatusCode();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">string</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> responseBody = </span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">await</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> response.Content.ReadAsStringAsync();</span></span></p>
<p style="padding-left: 30px;"><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">return</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> responseBody;</span></span></span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>We leverage the Authorize attribute to make sure the page does not process without the user being authenticated.</p>
<p>Next, a utility class is used to interact with the API Management REST API, and use the generateSsoUrl action.</p>
<p><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">public</span></span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">ActionResult</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> Index()</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">var</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> claimsPrincipal = </span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">Thread</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">.CurrentPrincipal </span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">as</span></span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">ClaimsPrincipal</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">;</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ViewBag.HasAccess = <span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">false</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">;</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">if</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> (claimsPrincipal != </span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">null</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">)</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">Claim</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> groupApimAdmin = claimsPrincipal.Claims.FirstOrDefault(</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c =&gt; c.Type ==&nbsp;<span style="color: #a31515; font-family: Consolas; font-size: x-small;"><span style="color: #a31515; font-family: Consolas; font-size: x-small;"><span style="color: #a31515; font-family: Consolas; font-size: x-small;">"groups"</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> &amp;&amp;&nbsp;</span></span> c.Value.Equals(groupToValidate, <span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">StringComparison</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">.CurrentCultureIgnoreCase));</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">if</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> (</span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">null</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> != groupApimAdmin)</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ViewBag.HasAccess = <span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">true</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">;</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">return</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> View();</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<h2>Deploying the app to Azure</h2>
<p>We&rsquo;ve also created a Cloud Deployment project in Visual Studio to help us with the deployment of the application to Azure. The Cloud Deployment project uses Azure Resource Management JSON template to create the web app, an App Service Plan and set the Application Settings we require for our app to function.</p>
<p style="padding-left: 30px;">Note: Before deploying though, make sure you have a Storage account created through the portal, as the Cloud Deployment Project requires this to temporarily copy the deployment contents.<br />This needs to be a Storage account using the Resource Manager deployment type &ndash; see more here <a href="https://azure.microsoft.com/en-us/documentation/articles/resource-manager-deployment-model/">https://azure.microsoft.com/en-us/documentation/articles/resource-manager-deployment-model/</a></p>
<p>In the Visual Studio project, the Cloud Deployment project already has a reference to the web application, this will build and generate a webdeploy package.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/1512.blog-apim1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/1512.blog_2D00_apim1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/1512.blog-apim1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/1512.blog_2D00_apim1.png" alt="" border="0" /></a></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/8836.blog-apim2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/8836.blog_2D00_apim2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/8836.blog-apim2.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/8836.blog_2D00_apim2.png" alt="" border="0" /></a></p>
<p>The JSON parameters can be entered through the Visual Studio interface, then click Save and Deploy to initialize the deployment to Azure.</p>
<p style="padding-left: 30px;">-&nbsp;webSiteName &ndash; the name of the website that will host the webapp&nbsp; - needs to be unique on Azure (so not just for your subscription)<br />-&nbsp;hostingPlanName &ndash; new app service plan name, unique only for your Azure account.<br />-&nbsp;apimTenantName &ndash; the name of the APIM account <br />-&nbsp;apimAdGroupId &ndash; GUID corresponding to the group to which the internal Admin users must belong to in order to get access to the Azure API Management publisher portal. See above for details on retrieving the right Group ID.<br />-&nbsp;apimSas &ndash; this is a secure string that needs to contain the ShareAccessSignature you created above. Only copy the part after ShareAccessSignature and remove the space. It should start with uid=&hellip;<br />-&nbsp;ApimDeployPackageFolder: The name of the app in Visual Studio<br />-&nbsp;ApimDeployPackageFileName: package.zip (use this name)</p>
<p>Review the Output window to validate the progress and successful completion of the ARM deployment.</p>
<h2>Securing the Web App</h2>
<p>The Azure web application uses <a href="https://azure.microsoft.com/en-us/blog/announcing-app-service-authentication-authorization/">Authorization/Authentication feature</a> in Azure App Service to secure the application itself. Once the user is allowed in through Azure AD authentication, it then validates the user is part of the predefined Group (claim). If valid, the Azure API Management REST API is used to generate a valid Admin User token. With this valid token the redirection to the Publisher portal is then initiated.</p>
<p>To set this up, go to your newly deployed Web App in the new <a href="https://portal.azure.com/">Azure Portal</a>. When browsing to the web app, you should see something like this.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/7418.blog-apim3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/7418.blog_2D00_apim3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/7418.blog-apim3.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/7418.blog_2D00_apim3.png" alt="" border="0" /></a></p>
<p>This is because we have used the [Authorize] attribute in the Controller, so that the web app is not accessible at all without the proper Authorization setup in Azure.</p>
<p>In the Azure portal, browse to the newly created web app, then click Authentication/Authorization.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/4237.blog-apim5.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/4237.blog_2D00_apim5.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/4237.blog-apim5.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/4237.blog_2D00_apim5.png" alt="" border="0" /></a></p>
<p>Choose On to activate the feature. Next choose &ldquo;Login with Azure Active Directory&rdquo; in the Action to take when request is not authenticated. Then continue by configuring Azure AD, click Not Configured to open the details pane.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/7838.blog-apim6.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/7838.blog_2D00_apim6.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/7838.blog-apim6.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/7838.blog_2D00_apim6.png" alt="" border="0" /></a></p>
<p>Choose Express settings, provide a unique name to the app. This will create and configure the unique App in Azure AD.</p>
<p>Note if you prefer to setup another Azure AD domain or app settings, you can manually configure the right app in Azure AD and choose the Advanced pane to just enter the app&rsquo;s ID and secret.</p>
<p>For this test we just choose the simple Express version. Click OK, then back in the main Authorization pane, click the Save button. You can now close the Authentication/Authorization pane.</p>
<h3>Configure Azure AD app settings</h3>
<p><br />With the above configuration, a new Azure AD application has been added. We still need to configure a few things. Browse to the (old) <a href="https://manage.windowsazure.com/">Azure Management portal</a> and open up your Azure AD domain details.<br />Choose Applications tab, then select Applications my company owns, and click the search button (v). The newly created app should be in the list. Click on it to open it. Go to the app&rsquo;s Configure tab and click Delegated Permissions, activate Read directory data, and then click SAVE.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/2235.blog-apim7.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/2235.blog_2D00_apim7.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/2235.blog-apim7.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/2235.blog_2D00_apim7.png" alt="" border="0" /></a></p>
<p>Next, after successfully saving, the bottom bar should now display a button &ldquo;Manage Manifest&rdquo;. In that action, choose Download manifest. Save it locally and open it up in a code editor. For more information about the Azure AD manifest, see here <a href="https://azure.microsoft.com/en-gb/documentation/articles/active-directory-application-manifest/">https://azure.microsoft.com/en-gb/documentation/articles/active-directory-application-manifest/</a>.<br />Edit your manifest and change &ldquo;groupMembershipClaims&rdquo; value to &ldquo;SecurityGroup&rdquo; instead of the value null.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/7838.blog-apim8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/7838.blog_2D00_apim8.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/7838.blog-apim8.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/7838.blog_2D00_apim8.png" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<p>Save the manifest.</p>
<p>Back in the Azure portal, in your Azure AD application were editing previously, click the Manage Manifest button again, this time choose Upload Manifest.<br />See the following article for a detailed overview of authorization with AD group claims:&nbsp; <a href="https://www.dushyantgill.com/blog/2014/12/10/authorization-cloud-applications-using-ad-groups/">https://www.dushyantgill.com/blog/2014/12/10/authorization-cloud-applications-using-ad-groups/</a></p>
<h3>Validating the solution</h3>
<p>Before testing if the solution works, make sure the App Settings have been updated with the different values:</p>
<p>&nbsp;</p>
<p>With all the settings configured, browse to the Web App again. Instead of receiving the error message, you should see a redirection to Azure AD authentication. If you are using the same browsing window as your Azure user, you will be redirected automatically as you are already authenticated. Now click the LOGIN button and you should have access to the Publisher portal for API Management.</p>
<p>To test correctly, I advise creating a new test user in Azure AD, assigning the user to the above group, and activating the user. Testing the application with the newly created user should work end to end.</p>
<p><strong>Possible issues</strong></p>
<p>-&nbsp;Token is not valid &ndash; to see the actual error message you can activate Stream logs<br />-&nbsp;Token has expired: generate a new one and update the Web App&rsquo;s app setting.<br />-&nbsp;Group claims does not return the required Group &ndash; you might see a detail in getting the newly assigned group of an AD user, this might seem like an error but I assume there is a cache that needs to expire so that new group memberships get returned with in the claims.</p>
<p>Security concerns: the access token is stored in the App Settings pane, which is accessible by Azure admins. Knowing the same admins also have access to the portal to generate a new token we don&rsquo;t think this is a big risk. You can evaluate storing the token in Key Vault and retrieving it from there.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>Azure API Management - Using PowerShell for backup and restore</title>
      <link>https://docs.microsoft.com/archive/blogs/katriend/azure-api-management-using-powershell-for-backup-and-restore</link>
      <pubDate>Fri, 02 Oct 2015 10:09:00 GMT</pubDate>
      <dc:creator><![CDATA[Katrien DG]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/katriend/2015/10/02/azure-api-management-using-powershell-for-backup-and-restore/</guid>
      <description><![CDATA[Automation is the new Black, as&nbsp;"said" by Mark Russinovich during AzureCon.

One of the ways...]]></description>
      <content:encoded><![CDATA[<p>Automation is the new Black, as&nbsp;"said" by Mark Russinovich during <a href="https://channel9.msdn.com/Events/Microsoft-Azure/AzureCon-2015/azurecon-bill-staples-innovative-applications">AzureCon</a>.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/3806.mark.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/3806.mark.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/3806.mark.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/3806.mark.png" alt="" border="0" /></a></p>
<p>One of the ways to automate in Azure is by using PowerShell tools for Azure, next to other options. I've been working with Azure API Management for some customers lately, and one interesting short post caught my attention: <a href="https://azure.microsoft.com/en-us/updates/full-set-of-windows-powershell-cmdlets-for-azure-api-management-api/">Full set of Windows PowerShell cmdlets for Azure API Management API</a>. This means that now a number of functions to manage API Management have been made available as PowerShell cmdlets, making it easy to use in automation tasks. <br />Backup and restore is one of the features I&rsquo;ve been using. While its primary use is for having a backup of your current API Management account, for example making sure this is done very regularly as a way to recover in the event of failure. Another use for the backup/restore feature is when going from development to a staging environment.<br /><a href="https://azure.microsoft.com/en-us/documentation/articles/api-management-howto-disaster-recovery-backup-restore/">Official documentation</a> for doing backup/restore shows us how to do this using the Azure Resource Manager based API Management REST API. But it also requires creating an Azure AD application, setting the right permissions and getting a token for authenticating requests to Azure Resource Manager. <a href="https://blogs.msdn.com/b/stuartleeks/archive/2015/04/29/azure-api-management-backing-up-and-restoring-configuration.aspx">Stuart Leeks</a> has an interesting blog post with an alternative non-supported way to use PowerShell, and now with the official cmdlets this is exactly what we can do.</p>
<p>So why not give that a try?</p>
<p>Creating a backup requires the following information: your API Management account, the resource group name and a storage account to which to save the backup to as well as the container in which it will go.</p>
<p><strong>Prepare for the backup</strong></p>
<p>1. Make sure you have configured PowerShell and connected to your subscription.</p>
<p>2. Connect to the storage account and make sure to create the container to which you will store your backup to. Note the name. You can do this through the Azure Management Portal, or using a Storage explorer tool. Also take note of the type of Storage that you are using. There are currently two types, one used in the current Management Portal, and the new mode using Azure Resource Manager.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/7455.blog-storage-classic.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/7455.blog_2D00_storage_2D00_classic.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/7455.blog-storage-classic.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94/7455.blog_2D00_storage_2D00_classic.png" alt="" border="0" /></a></p>
<p>3. Identify the name of the Resource Group in which your API Management account is created: use <a href="https://resources.azure.com/">https://resources.azure.com/</a> to navigate to the subscription. The resource group name has automatically been created, and is in the form of 'Api-Default-{service-region}'.<br />Run backup</p>
<p><strong>Create a Storage Context.</strong></p>
<p><span style="font-family: courier new,courier;">&nbsp;if ($ARMStorage)</span><br /><span style="font-family: courier new,courier;">&nbsp;{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;Switch-AzureMode AzureResourceManager</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp; $StorageAccountKey = (Get-AzureStorageAccountKey -ResourceGroupName $StorageAccountResourceGroupName -Name $StorageAccountName).Key1</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; else</span><br /><span style="font-family: courier new,courier;">&nbsp;{</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;Switch-AzureMode AzureServiceManagement</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp; $StorageAccountKey = (Get-AzureStorageKey -StorageAccountName $StorageAccountName).Primary </span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp; }</span><br />&nbsp;&nbsp;&nbsp;</p>
<p><span style="font-family: courier new,courier;">$StorageAccountContext = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey</span></p>
<p><strong>Run backup</strong></p>
<p><span style="font-family: courier new,courier;">Switch-AzureMode AzureResourceManager</span></p>
<p><span style="font-family: courier new,courier;">Backup-AzureApiManagement -Name "myAPIMaccount" -ResourceGroupName "Api-Default-West-Europe" -StorageContext $StorageAccountContext `</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -TargetContainerName "mycontainer" `</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -TargetBlobName "myapimbackupddmmyy"</span></p>
<p>Typically you&rsquo;d create variables for the above values, but for testing we can hard-code them.<br />For automating the backup you can use something like Azure Automation, currently you&rsquo;ll need some <a href="https://azure.microsoft.com/en-us/blog/using-azure-resource-manager-in-azure-automation-runbooks/">manual work</a> to support Azure Resource Manager though.</p>
<p><strong>Run restore</strong></p>
<p>To run a restore, simply run the following command.</p>
<p><span style="font-family: courier new,courier;">Restore-AzureApiManagement -Name "myAPIMaccount" -ResourceGroupName "Api-Default-West-Europe" `</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -StorageContext $StorageAccountContext `</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -SourceContainerName "mycontainer" `</span><br /><span style="font-family: courier new,courier;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -SourceBlobName "myapimbackupddmmyy" -Verbose</span></p>
<p>Do read through the notes on the <a href="https://azure.microsoft.com/en-us/documentation/articles/api-management-howto-disaster-recovery-backup-restore/#step1">official documentation</a> to understand some of the constraints, including the fact that a restore is only guaranteed maximum 7 days after backup.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>How do you build a Windows Store Line-of-Business app?</title>
      <link>https://docs.microsoft.com/archive/blogs/katriend/how-do-you-build-a-windows-store-line-of-business-app</link>
      <pubDate>Tue, 28 May 2013 02:49:09 GMT</pubDate>
      <dc:creator><![CDATA[Katrien DG]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/katriend/2013/05/28/how-do-you-build-a-windows-store-line-of-business-app/</guid>
      <description><![CDATA[When building a line-of-business (LOB) app there are numerous things to consider.&#160; Of course...]]></description>
      <content:encoded><![CDATA[<p><a href="https://msdn.microsoft.com/en-us/library/windows/apps/xx130655.aspx"><img title="image" style="margin: 0px 0px 0px 10px; float: right; display: inline; background-image: none;" border="0" alt="image" align="right" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/metablogapi/7737.image_2C7B9BF5.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94-metablogapi/7737.image_5F00_2C7B9BF5.png" width="127" height="163" /></a>When building a line-of-business (LOB) app there are numerous things to consider.&#160; Of course you need a great user experience, but what about validating user input, user authentication, how do you deal with application state across suspend-resume, do you roam app state across devices, and there is much more to think about. </p>  <p>Now you can <em>accelerate your development time to build a Windows Store LOB app</em>. A couple of days ago the <a href="https://pnp.azurewebsites.net/en-us/">Pattern &amp; Practices team</a> have released <strong>Prism for Windows Runtime</strong> and the associated <strong>AdventureWorks Shopper</strong> reference implementation to the <a href="https://msdn.microsoft.com/en-us/library/windows/apps/xx130643.aspx">Windows Dev Center</a>. </p>  <h3>What is Prism for Windows Runtime?</h3>  <p>The Prism for Windows Runtime release provides you guidance to help you more easily design and build flexible and easy-to-maintain Windows Store apps using C# and XAML and the Windows Runtime.</p>  <p>Prism comes with the AdventureWorks Shopper reference implementation which uses the Prism library to demonstrate modern development practices such as Model-View-ViewModel (MVVM) pattern with navigation and app lifecycle management. Additionally the reference implementation demonstrates validation, application data management, accessibility, localizability, touch, search, tiles, tile notification, and multiple view states.</p>  <p>&#160;</p>  <h3>Where do you get started?</h3>  <p>The Prism library source code is available with the AdventureWorks Shopper reference implementation on the MSDN Code Gallery at <a href="https://code.msdn.microsoft.com/windowsapps/Prism-for-the-Windows-86b8fb72">https://aka.ms/prism-winrt-code</a>. The Prism binaries will also be available on NuGet starting Monday May 20. Search for Prism.&#160; You can view the documentation at <a href="https://msdn.microsoft.com/en-us/library/windows/apps/xx130643.aspx">https://aka.ms/prism-winrt-doc</a> or download a PDF version at <a href="https://www.microsoft.com/en-us/download/details.aspx?id=39042">https://aka.ms/prism-winrt-pdf</a>.</p>  <p><font color="#3a3e43" face="Segoe UI Semibold"></font></p>  <p>Check also our local <a href="https://msdn.be/apps">Apps on Windows portal</a> for more resources on how to develop apps for Windows 8, Windows Azure and Windows Phone – you can find local trainings and events, contests and links to online training resources.</p>]]></content:encoded>
    </item>
    <item>
      <title>Joining the Windows 8 App Race? Win Visual Studio headphones and Asus tablets</title>
      <link>https://docs.microsoft.com/archive/blogs/katriend/joining-the-windows-8-app-race-win-visual-studio-headphones-and-asus-tablets</link>
      <pubDate>Wed, 17 Apr 2013 23:32:00 GMT</pubDate>
      <dc:creator><![CDATA[Katrien DG]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/katriend/2013/04/17/joining-the-windows-8-app-race-win-visual-studio-headphones-and-asus-tablets/</guid>
      <description><![CDATA[We want to give you a push in the back to develop great applications – join the Windows 8 App...]]></description>
      <content:encoded><![CDATA[<p><a href="https://www.microsoft.com/belux/msdn/apps/windows/asus-vivo-tab-contest.aspx" target="_blank"><img border="0" alt="Join the App Race and win!" src="https://www.microsoft.com/belux/newsletters/msdn/app-race/header.jpg" width="600" height="200" /></a></p>  <p>   <br />We want to give you a push in the back to develop great applications – join the <a href="https://aka.ms/race" target="_blank">Windows 8 App Race</a> and win:</p>  <p><a href="https://aka.ms/race" target="_blank"><img title="Windows 8 App Race" style="border: 0px currentcolor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" border="0" alt="Windows 8 App Race" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/metablogapi/2313.image_2AC3551A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94-metablogapi/2313.image_5F00_2AC3551A.png" width="556" height="255" /></a></p>  <p><strong>How to win</strong></p>  <p>Your app(s) need to be published <strong>between April 1 and June 15, 2013</strong>. Complete the contest form(s) on <a href="https://aka.ms/race">https://aka.ms/race</a>. </p>  <p>There is no limit to the number of entries you can submit but each entry must be substantially unique and different. The date and time of the first and fifth application as part of the entry submitted in a particular timeframe will determine the winners of the tablets. Note: this contest is only open for residents from <strong>Belgium and Luxembourg</strong>. Please read the full <a href="https://sdrv.ms/117fC2b">terms &amp; conditions</a> of this contest before entering. Questions? Contact us <a href="mailto:msdnbewm@microsoft.com">msdnbewm@microsoft.com</a>.     <br />    <br />We’re looking forward to see your apps shine in the Store … and who knows soon on your brand new Asus tablet!</p>]]></content:encoded>
    </item>
    <item>
      <title>Windows Azure Infrastructure as a Service General Availability</title>
      <link>https://docs.microsoft.com/archive/blogs/katriend/windows-azure-infrastructure-as-a-service-general-availability</link>
      <pubDate>Tue, 16 Apr 2013 23:19:47 GMT</pubDate>
      <dc:creator><![CDATA[Katrien DG]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/katriend/2013/04/16/windows-azure-infrastructure-as-a-service-general-availability/</guid>
      <description><![CDATA[Microsoft just announced the general availability of our Windows Azure Infrastructure as a Service...]]></description>
      <content:encoded><![CDATA[<p><a href="https://www.windowsazure.com/en-us/home/scenarios/infrastructure-services/"><img title="image" style="border: 0px currentcolor; display: inline; background-image: none;" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/metablogapi/7485.image_7A63400A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94-metablogapi/7485.image_5F00_7A63400A.png" width="629" height="144" /></a></p>  <p>Microsoft just announced the <strong>general availability of our Windows Azure Infrastructure as a Service</strong> (IaaS) support! With this release Azure Virtual Machines and Virtual Network move out of Preview and are now ready to use for your production apps.</p>  <p>With Azure Virtual Machines you can deploy and run durable VMs in the cloud, provisioned from prebuilt templates or alternatively upload your own custom-built VMs.&#160; All this in a matter of seconds!&#160; Azure Virtual Network allows you to securely bridge between your on-premises infrastructure and your infrastructure in the cloud. This gives you the flexibility to run your workloads where you want, but manage them all in the same way.</p>  <p>Whether you want to securely extend your on-premises network to Windows Azure or you want to create a virtual private network with persistent private IPs..</p>  <p>Let’s look in more detail into what we have announced today:</p>  <ul>   <li>For memory intensive scenarios, we are now introducing two <strong>high-memory compute instances</strong>: 4 core x 28GB RAM and 8 core x 56GB RAM. With these VM sizes you can run even larger workloads on Windows Azure, for example SharePoint Server or SQL Server workloads.</li>    <li>We have added several <strong>new VM image templates </strong>to the Image Gallery, such as SQL Server 2012, BizTalk Server 2013 and SharePoint Server 2013 images. These images also come with hourly billing, so you don’t have to pay for an upfront license.</li>    <li>We have <strong>updated the SLA </strong>for Virtual Machines and Virtual Network.&#160; For VMs that have 2 or more instances deployed in the same availability set, we have a 99.95% SLA for external connectivity.&#160; For Virtual Network, we guarantee a 99.9% Virtual Network Gateway availability.</li>    <li>As of this announcement, Virtual Machines and Virtual Network are now <strong>supported by Microsoft Support </strong>staff, so you can confidently run your production apps on Azure.</li> </ul>  <p>&#160;</p>  <p>On top of all these great features, we’re also announcing <strong>significant pricing reductions </strong>to our Windows Azure PaaS and IaaS VM pricing. You can expect to see from 20% (Virtual Machines) to 33% (Cloud Services) price reductions! These new prices are effective as of June 1.&#160; And as of today, we’re also adding <strong>50 hours of free memory-intensive-instance hours </strong>to our member offers and 90-day trials.</p>  <p>For a more detailed description of the announcement, you can check out Scott Guthrie’s <a href="https://weblogs.asp.net/scottgu/archive/2013/04/16/windows-azure-general-availability-of-infrastructure-as-a-service-iaas.aspx">blog post</a>.</p>  <p>If you don’t already have a Windows Azure account, you can sign-up for a <a href="https://www.windowsazure.com/en-us/pricing/free-trial/?WT.mc_id=AD1912485">free trial</a> and start using all of the above features today.&#160; Did you know that you already have a lot of <a href="https://www.windowsazure.com/en-us/pricing/member-offers/">free Azure resources</a> as part of your MSDN, MPN or BizSpark membership?&#160; </p>  <p>If you want to learn more about our Windows Azure IaaS capabilities, don’t forget to listen in on our <a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032549870&amp;Culture=en-us&amp;community=0">dedicated IaaS webcast on April 30</a>. If you want to experience this great technology hands-on, join us for our <a href="https://aka.ms/itcampsbe">Azure IT Camp on May 6</a>.</p>  <p>Also don’t forget there is a virtual conference runnning next Tuesday April 23rd: <a title="https://www.windowsazureconf.net/" href="https://www.windowsazureconf.net/">https://www.windowsazureconf.net/</a></p>]]></content:encoded>
    </item>
    <item>
      <title>TechDays Belgium 2013 online: videos and slides now available!</title>
      <link>https://docs.microsoft.com/archive/blogs/katriend/techdays-belgium-2013-online-videos-and-slides-now-available</link>
      <pubDate>Fri, 22 Mar 2013 04:11:15 GMT</pubDate>
      <dc:creator><![CDATA[Katrien DG]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/katriend/2013/03/22/techdays-belgium-2013-online-videos-and-slides-now-available/</guid>
      <description><![CDATA[&#160;&#160; We organized Microsoft TechDays 2013 in Antwerp two weeks ago, where we welcomed...]]></description>
      <content:encoded><![CDATA[<p><a href="https://techdays.be" target="_blank"><img title="TechDays" style="border: 0px currentcolor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" border="0" alt="TechDays" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/metablogapi/6175.image_261DD5A1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94-metablogapi/6175.image_5F00_261DD5A1.png" width="505" height="90" /></a></p>  <p>&#160;&#160; <br />We organized <a href="https://techdays.be" target="_blank">Microsoft TechDays 2013</a> in Antwerp two weeks ago, where we welcomed close to 2900 IT Professionals, Developers and Students all enjoying 90+ sessions with top content led by a broad selection of international and local top speakers. A special <strong>THANK YOU</strong> goes to our <a href="https://www.microsoft.com/belux/techdays/2013/Partners.aspx" target="_blank">partners</a>, our MVP’s and <a href="https://microsoft.be/meet" target="_blank">MEET</a> (Microsoft Extended Experts Team) members and of none the least, all our enthusiastic attendees!&#160; Check out the <a href="https://www.microsoft.com/belux/techdays/2013/Home.aspx#p=pics" target="_blank">pictures</a> to get an idea!</p>  <p><font size="4">What’s next?</font></p>  <p>The <strong>session videos and slides are now available</strong> on <a href="https://www.techdays.be">www.techdays.be</a>! (Re)live the sessions and take the next steps to truly master the technologies. </p>  <p>Here’s a selection of my favorite picks out of the difficult to choose from list!</p>  <table cellspacing="0" cellpadding="2" width="495" border="0"><tbody>     <tr>       <td valign="top" width="493"><a href="https://www.microsoft.com/belux/techdays/2013/SessionDetail.aspx?sessionId=92" target="_blank">Watch the keynote</a> to learn how Microsoft sees the Platform for modern apps – with devices &amp; services taking a central role. Keynote by Tim O’Brien with demos by Nick Harris, Ben Riga, Brian Keller. We also finish off with a case presentaion of the TechDays apps by Kristof Rennen and Gitter Vermeiren.           <br /><strong>Note</strong>: you can learn much more of the behind the scènes of building these apps. Don’t miss <a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032546899&amp;Culture=en-us&amp;community=0" target="_blank">our webcast</a> next week 26 March at 2PM CET.           <br /></td>     </tr>      <tr>       <td valign="top" width="493">         <p><a href="https://www.microsoft.com/belux/techdays/2013/SessionDetail.aspx?sessionId=88" target="_blank">Become a Windows 8 and Windows Phone App Developer at TechDays</a> with Ben Riga</p>       </td>     </tr>      <tr>       <td valign="top" width="493">         <p><a href="https://www.microsoft.com/belux/techdays/2013/SessionDetail.aspx?sessionId=81" target="_blank">Bigger, Faster, Stronger: Optimizing ASP.NET 4 and 4.5 Applications</a> with Mads Kristensen</p>       </td>     </tr>      <tr>       <td valign="top" width="493">         <p><a href="https://www.microsoft.com/belux/techdays/2013/SessionDetail.aspx?sessionId=58" target="_blank">Behind the scenes of (as many) C# language features</a> with Bart De Smet</p>       </td>     </tr>   </tbody></table>  <p>&#160;</p>  <p><strong>The Hands-on Labs      <br /></strong>Many of you also took the opportunity to run through one or more hands-on labs. Good news, if you did not have the time and would like to give a first try on the Windows Store, Windows Phone, or Windows Azure step by step tutorial: you can! The labs can now be downloaded and followed on your own computer. Go here for the latest version: <a title="https://bit.ly/applabbe" href="https://bit.ly/applabbe">https://bit.ly/applabbe</a></p>  <p>Enjoy!</p>  <p>The TechDays Team&#160;&#160;&#160; </p>  <p>   <br />Questions? Connect with us on <a href="https://click.email.microsoftemail.com/?qs=60a749e68bbe123d8cbf1f66578001d6e9a9efc920f2aba178986fbf3292b6a1eb0300ede5241bb5">Twitter</a>, <a href="https://click.email.microsoftemail.com/?qs=60a749e68bbe123d1d0cc46651a17f9823fb5f840eeebc71779c01f09f6a5ba49e932b5c22008d1e">Facebook</a> or simply via <a href="mailto:tdbelux@microsoft.com">e-mail</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Start building apps on Windows 8 – Video training content (French)</title>
      <link>https://docs.microsoft.com/archive/blogs/katriend/start-building-apps-on-windows-8-video-training-content-french</link>
      <pubDate>Mon, 04 Mar 2013 06:25:00 GMT</pubDate>
      <dc:creator><![CDATA[Katrien DG]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/katriend/2013/03/04/start-building-apps-on-windows-8-video-training-content-french/</guid>
      <description><![CDATA[As announced by our friends at the Microsoft Innovation Center, Renaud Dumont, their evangelist has...]]></description>
      <content:encoded><![CDATA[<p>As announced by our friends at the <a href="https://blog.mic-belgique.be/articles/mooc-decouvrez-windows-8/">Microsoft Innovation Center</a>, Renaud Dumont, their evangelist has put together a set of videos in the form of a training to get started on Windows 8 development.</p>
<p><strong>If you speak French, check out the great work they have prepared and jumpstart your Windows 8 app development!</strong>&nbsp;</p>
<p><img title="Windows 8" src="https://blog.mic-belgique.be/wp-content/uploads/2013/02/WindowsCyan_Web1.jpg" alt="" width="189" height="44" /></p>
<p>This MOOC (in French) is an introduction to that new Windows 8 development environment. It&rsquo;s meant for people who want to get started quickly.</p>
<h4><strong>Objectives:</strong></h4>
<p>With the videos, you&rsquo;ll learn :</p>
<ul>
<ul>
<ul>
<li>The new Windows 8&nbsp;</li>
<li>WinRT, the framework for Modern apps&nbsp;&nbsp;</li>
<li>8 design principles for Windows 8&nbsp;</li>
<li>What&rsquo;s new for Web developers&nbsp;</li>
<li>What&rsquo;s new for .NET developers&nbsp;</li>
<li>A few new controls&hellip;</li>
</ul>
</ul>
</ul>
<h4><strong>Course :</strong></h4>
<h5>1. Introduction :</h5>
<ul>
<ul>
<ul>
<li>1.1 &ndash; <a href="https://bit.ly/windows-8-intro-1">Resources and useful links</a>&nbsp;&nbsp;</li>
<li>1.2 &ndash; <a href="https://bit.ly/windows-8-intro-2">Windows 8 for the end user</a></li>
<li>1.3 &ndash; <a href="https://bit.ly/windows-8-intro-3">WinRT, the modern framework</a></li>
<li>1.4 &ndash; <a href="https://bit.ly/windows-8-intro-4">Application lifecycle</a></li>
</ul>
</ul>
</ul>
<h5>2. Windows 8 design principles :</h5>
<ul>
<ul>
<ul>
<li>2.1 &ndash; <a href="https://bit.ly/windows-8-principes-design-1">Focus on content</a></li>
<li>2.2 &ndash; <a href="https://bit.ly/windows-8-principes-design-2">Be fast and fluid</a></li>
<li>2.3 &ndash; <a href="https://bit.ly/windows-8-principes-design-3">Responsive and scalable design</a></li>
<li>2.4 &ndash; <a href="https://bit.ly/windows-8-principes-design-4"><span style="color: #acb613;">Take advantage of contracts</span></a></li>
<li>2.5 &ndash; <a href="https://bit.ly/windows-8-principes-design-5">Live Tile and Roaming</a></li>
</ul>
</ul>
</ul>
<h5>3. Development&rsquo;s basics :</h5>
<ul>
<ul>
<ul>
<li>3.1 &ndash; <a href="https://bit.ly/windows-8-bases-dev-1">For web developers</a></li>
<li>3.2 &ndash; <a href="https://bit.ly/windows-8-bases-dev-2">For .NET developers</a></li>
<li>3.3 &ndash; <a href="https://bit.ly/windows8-bases-dev-3">New controls</a></li>
<li>3.4 &ndash; <a href="https://bit.ly/windows-8-bases-dev-4">Present data with GridView and ListView</a></li>
<li>3.5 &ndash; <a href="https://bit.ly/windows-8-bases-dev-5">Makes your layout responsive with XAML and CSS</a></li>
</ul>
</ul>
</ul>
<h4><strong>Resources :</strong></h4>
<p><img style="float: right; display: inline;" title="Windows 8" src="https://blog.mic-belgique.be/wp-content/uploads/2013/02/windows-8-logo1.jpg" alt="" width="280" height="200" align="right" /></p>
<p>Now that you&rsquo;re ready to start developing your own Windows Store app, you probably want to dive into code&hellip; Here are some must-have resources:</p>
<p><span style="font-size: x-small;">Microsoft Belgium &amp; Luxembourg:</span></p>
<p>The reference for every Windows developer in Belgium. Have a look at the agenda to know about all the Windows 8 events planned by Microsoft and the community. <br /><a href="https://www.microsoft.com/belux/msdn/apps/windows/default.aspx">https://www.microsoft.com/belux/msdn/apps/windows/default.aspx</a></p>
<h5>Windows 8 Dev Camp In a Box :</h5>
<p>A Hands-On kit containing all the labs you need to learn how to build Windows Store apps. It is available in JS/HTML and in C#/XAML. <br /><a href="https://aka.ms/windows8campinabox">https://aka.ms/windows8campinabox</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Belgian Windows 8 Superhackathon on 27 March 2013 – join us!</title>
      <link>https://docs.microsoft.com/archive/blogs/katriend/belgian-windows-8-superhackathon-on-27-march-2013-join-us</link>
      <pubDate>Wed, 20 Feb 2013 08:32:26 GMT</pubDate>
      <dc:creator><![CDATA[Katrien DG]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/katriend/2013/02/20/belgian-windows-8-superhackathon-on-27-march-2013-join-us/</guid>
      <description><![CDATA[Join us in Brussels, Genk, Kortrijk or Mons on March 27th for the 4-locations Belgian Windows 8...]]></description>
      <content:encoded><![CDATA[<p>Join us in Brussels, Genk, Kortrijk or Mons on March 27<sup>th</sup> for the 4-locations Belgian Windows 8 first <strong>Superhackathon</strong>. Code, build, eat, drink &amp; win.    <br />Experts will be on site to help you with the last phase of building your first Windows 8 or Windows Phone 8 application. <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/metablogapi/0876.superhackathon_logo_final_388EA048.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94-metablogapi/0876.superhackathon_5F00_logo_5F00_final_5F00_388EA048.png"><img title="superhackathon_logo_final" style="float: right; display: inline; background-image: none;" border="0" alt="superhackathon_logo_final" align="right" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/metablogapi/0702.superhackathon_logo_final_thumb_45888059.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94-metablogapi/0702.superhackathon_5F00_logo_5F00_final_5F00_thumb_5F00_45888059.png" width="290" height="228" /></a></p>  <p>We come to your cities (4!), we bring the experts (many!), feed you with breakfast, pizza, coffee (lots!) and Red Bull, honor you with prizes and rewards (countless!). End goal: Get to Windows Store, have fun doing it, go home with prizes (to be announced soon, we promise you: you’ll really like them!). Hint hint: for the best quality app we’ll have a conference ticket… </p>  <p>Go ahead and reserve your spot. Join us for the Day event or the Night event or both. See the agenda setup at the bottom of this post.</p>  <ul>   <li><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032545515&amp;Culture=en-US">Register for the hackathon in Brussels</a></li>    <li><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032545528&amp;Culture=en-US">Register for the hackathon in Genk</a></li>    <li><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032545531&amp;Culture=en-US">Register for the hackahton in Kortrijk</a></li>    <li><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032545534&amp;Culture=en-US">Register for the hackathon in MIC Mons</a></li> </ul>  <p>&#160;</p>  <p><strong>Superhackathon theme</strong>    <br />Yes, winter is cosy with the snow and all – but after months of darkness we all need light. So the theme for the superhackathon is around spring, well-being, health and happiness. To be interpreted very broadly <img class="wlEmoticon wlEmoticon-smile" alt="Smile" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/metablogapi/5670.wlEmoticon-smile_3671A17F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94-metablogapi/5670.wlEmoticon_2D00_smile_5F00_3671A17F.png" />    <br />Feel the ideas coming?</p>  <p><strong>First time app</strong>? Build your first one – see how to get started <a href="https://www.microsoft.com/belux/msdn/apps/windows/4-steps.aspx">here</a>.</p>  <p><strong>Design reference templates     <br /></strong>You can use a template fully created for the Windows 8 style &amp; experience. Just by binding the relevant data, you should have a good looking app that runs in the paradigm of Windows 8. And the good news: the templates are available as Visual Studio 2012 project in both C#/XAML and HTML/JavaScript options. <u><a href="https://www.codeplex.com/site/search?query=win8template">So pick your template and platform and build your app in a breeze</a>.</u></p>  <p>The template addresses App Views (Landscape, Fill, Snap and Portrait), Live Tiles, Search &amp; Share Contract, Settings, Navigation across pages, Bottom &amp; Top App Bar (If applicable). So get started today and finish off the app together with us!</p>  <p>&#160;</p>  <h3>Agenda</h3>  <p><strong>Day</strong></p>  <p>8:30: Welcome and registration</p>  <p>9:00 – 9:30: Introduction and getting started</p>  <p>9:30 – 12:30: Coding (alone or with your group)Guidance, hands-on labs and expert advice on site</p>  <p>12:30 – 13:30: Lunch</p>  <p>13:30 – 16:00: Coding (alone or with your group)Guidance, hands-on labs and expert advice on site</p>  <p>16:00 – 17:00: Demo time and best app showdown for Day attendees   <br />Publish your first finished app: prize</p>  <p>17:00: Break and end of the Day part</p>  <p>   <br /><strong>Night</strong></p>  <p>17:30: Welcome and registration (or continue working for those going for the full day)</p>  <p>18:00 – 18:30: Introduction and getting started</p>  <p>18:30 – 19:30: Coding (alone or with your group)Guidance, hands-on labs and expert advice on site</p>  <p>19:30 – 20:30: Dinner</p>  <p>20:30 – 23:00: Coding (alone or with your group)Guidance, hands-on labs and expert advice on site</p>  <p>23:00 – 24:00: Demo time and best app showdown   <br />Publish your first finished app: prize</p>  <p>24:00: End</p>]]></content:encoded>
    </item>
    <item>
      <title>Modern.IE: new tool for web developers for browser testing and compatibility</title>
      <link>https://docs.microsoft.com/archive/blogs/katriend/modern-ie-new-tool-for-web-developers-for-browser-testing-and-compatibility</link>
      <pubDate>Fri, 01 Feb 2013 05:58:50 GMT</pubDate>
      <dc:creator><![CDATA[Katrien DG]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/katriend/2013/02/01/modern-ie-new-tool-for-web-developers-for-browser-testing-and-compatibility/</guid>
      <description><![CDATA[Earlier this week, Microsoft launched Modern.IE: a new web base tool that helps you test, identify,...]]></description>
      <content:encoded><![CDATA[<p>Earlier this week, Microsoft launched <a href="https://www.modern.ie/" target="_blank">Modern.IE</a>: a new web base tool that helps you test, identify, and correct browser compatibility. Whether you are on Windows or not, Modern.IE will help you optimize your site for cross-browser compatibility and provide lots of guidance and tools to help you implement it.</p>  <p>To discover what Modern.IE is all about, check out the video below and then dive into the site to start benefiting from the tools.</p>  <p>&#160;</p>  <p><iframe height="315" src="https://www.youtube.com/embed/MH_Dao4FEfQ" frameborder="0" width="560" allowfullscreen="allowfullscreen"></iframe> </p>  <h1>The main features:</h1>  <h2>1. Scanning a web page</h2>  <p>The <a href="https://www.modern.ie/report">page scan tool</a> detects common coding practices that may cause compatibility problems, giving you clear indication of where the issues are occurring and providing you with guidance on how to solve the issues to deliver a better experience to your users.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/metablogapi/5661.image_1CF8A96D.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94-metablogapi/5661.image_5F00_1CF8A96D.png"><img title="image" style="border: 0px currentcolor; display: inline; background-image: none;" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/95/94/metablogapi/1856.image_thumb_4F0FD3EA.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-95-94-metablogapi/1856.image_5F00_thumb_5F00_4F0FD3EA.png" width="431" height="216" /></a></p>  <p>&#160;</p>  <h2>2. Virtual testing tools</h2>  <p><a href="https://www.modern.ie/virtualization-tools">Testing</a> on multiple versions of Internet Explorer is hard. With the virtual test tools, Modern.IE delivers two solutions to help you:</p>  <ul>   <li>A <strong>free 3-month subscription to BrowserStack</strong> that allows you to test your sites through a web based application, without the need to setup a virtual environment.</li>    <li><strong>Virtualized environments</strong> for you to download on Windows, Mac and Linux</li> </ul>  <p>&#160;</p>  <h2>3. Code with standards guidance</h2>  <p>A great overview written by <a href="https://twitter.com/reybango">Rey Bango</a> and <a href="https://twitter.com/davemethvin">Dave Methvin</a> on <a href="https://www.modern.ie/cross-browser-best-practices" target="_blank">coding practices and patterns</a> for building modern standards-based sites while still supporting older versions of Internet Explorer.</p>  <p>Highly recommended: <a href="https://www.modern.ie/">Modern.IE</a>.</p>]]></content:encoded>
    </item>
  </channel>
</rss>