{"id":413,"date":"2009-03-23T13:44:00","date_gmt":"2009-03-23T22:44:00","guid":{"rendered":"http:\/\/www.cloudidentity.com\/blog\/2009\/03\/23\/fun-with-federation-2-using-geneva-server-for-adding-a-relying-party-relationship-to-the-identity-provider\/"},"modified":"2009-03-23T13:44:00","modified_gmt":"2009-03-23T22:44:00","slug":"fun-with-federation-2-using-geneva-server-for-adding-a-relying-party-relationship-to-the-identity-provider","status":"publish","type":"post","link":"https:\/\/www.cloudidentity.com\/blog\/2009\/03\/23\/fun-with-federation-2-using-geneva-server-for-adding-a-relying-party-relationship-to-the-identity-provider\/","title":{"rendered":"Fun with Federation 2: using Geneva Server for adding a Relying Party relationship to the Identity Provider"},"content":{"rendered":"<div class=\"wlWriterHeaderFooter\" style=\"float:right;margin:0px;padding:0px 0px 4px 8px\">digg_url = &#8220;http:\/\/blogs.msdn.com\/vbertocci\/archive\/2009\/03\/23\/fun-with-federation-2-using-geneva-server-for-adding-a-relying-party-relationship-to-the-identity-provider.aspx&#8221;;digg_title = &#8220;Fun with Federation 2: using Geneva Server for adding a Relying Party relationship to the Identity Provider&#8221;;digg_bgcolor = &#8220;#FFFFFF&#8221;;digg_skin = &#8220;normal&#8221;;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;<\/div>\n<p>After a short but sweet weekend, we are back to our <a href=\"http:\/\/blogs.msdn.com\/vbertocci\/archive\/2009\/03\/19\/fun-with-federation-1-asp-net-geneva-framework-fedutil-exe.aspx\">federation chat<\/a>. <a href=\"http:\/\/blogs.msdn.com\/vbertocci\/archive\/2009\/03\/19\/fun-with-federation-1-asp-net-geneva-framework-fedutil-exe.aspx\">Last week<\/a> I presented the perspective of the application (RP) developer who, while not being an identity guru, does take advantage of identity info for driving the behavior of his application. Today we are going to see things from the perspective of the administrator who runs the IP (which in our sample is called Adatum) and makes possible the claims flow from the IP to the RP.<\/p>\n<p>Let\u2019s see a quick itemized summary of the steps that the developer performed during the <a href=\"http:\/\/blogs.msdn.com\/vbertocci\/archive\/2009\/03\/19\/fun-with-federation-1-asp-net-geneva-framework-fedutil-exe.aspx\">last installment<\/a>:<\/p>\n<ol>\n<li>created the application website<\/li>\n<li>Used fedutil for establishing a relationship with the IP (Adatum)<\/li>\n<ol>\n<li>Entered the apps\u2019 coordinates (web.config &amp; URI)<\/li>\n<li>Pointed to the IP metadata<\/li>\n<li>Cherry-picked the claims the application requires<\/li>\n<li>Wrote down the URI of the newly created application metadata<\/li>\n<\/ol>\n<li>Sent the URI of the application metadata to the IP and waited for an answer<\/li>\n<li>Received the green light from the IP and completed the application with code that takes advantage of identity info<\/li>\n<\/ol>\n<p>What we describe today takes place between the step 3 and 4 above.<\/p>\n<h1>Establishing a Relationship with a Relying Party<\/h1>\n<p>Today we are an administrator at Adatum. We just received an email from our partner, FabrikamShipping, informing us that they provisioned an app that relies on claims coming from Adatum and they need us to register it in our systems, so that the claim juices can start to flow. They provide us with the URI of the application metadata, a piece of data that makes our job really simple.<\/p>\n<p>We start by firing up the Geneva Server MMC.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/cloudidentity.com\/blog\/wp-content\/uploads\/2009\/03\/image_7ef90020-a15f-49ce-9a64-4cc7fd6743d1.png\" width=\"554\" height=\"404\" \/> <\/p>\n<p>As you may have guessed from the names, this Geneva Server is the same one I used for the demo <a href=\"http:\/\/channel9.msdn.com\/pdc2008\/BB11\/\">in Kim\u2019s PDC session<\/a>: the RPs listed above are the ones with which Adatum already has a relationship, namely the Microsoft Federation Gateway (used for SSO in CRM online in the demo), the fabrikamshipping shipping application (the main demo app) and a little experiment from the geneva framework sample list. For details about the scenario in which those are used, please refer to the demo parts of the session above (minute 31\u2019 on in <a href=\"http:\/\/channel9.msdn.com\/pdc2008\/BB11\/\">this video<\/a>).<\/p>\n<p>Let\u2019s go ahead and add a new relying party: in line with the MMC experience, we can easily do that via action pane or via right-click:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/cloudidentity.com\/blog\/wp-content\/uploads\/2009\/03\/image_1686e54a-b9ff-44fa-a97d-c726dc24c569.png\" width=\"319\" height=\"271\" \/> <\/p>\n<p>And in good tradition, the process is implemented in wizard form.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/cloudidentity.com\/blog\/wp-content\/uploads\/2009\/03\/image_a884677c-58bd-4517-8f89-a2f2e3dddb96.png\" width=\"554\" height=\"442\" \/> <\/p>\n<p>The very first step is retrieving the application\u2019s metadata, so that we can get to know all the requirements at once &amp; unambiguously; even better, we can count on this for tracking the future evolutions of the app and maintain the relationship accordingly without having to corral many different scattered parameters. Now THAT\u2019s progress!<\/p>\n<p>Note that the UI also allows us to address the case in which we don\u2019t have metadata available and we want to enter parameters manually: that would be the case for the Access Control Service, for example.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/cloudidentity.com\/blog\/wp-content\/uploads\/2009\/03\/image_3d446e15-0b82-4fad-9afe-97855f5ded33.png\" width=\"554\" height=\"443\" \/> <\/p>\n<p>The system verifies that the metadata document is there and valid, then moves on. Here we can add some mnemonics for the RP entry in our UI.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/cloudidentity.com\/blog\/wp-content\/uploads\/2009\/03\/image_941ceace-0694-4adf-b42c-743a6b584f30.png\" width=\"554\" height=\"442\" \/> <\/p>\n<p>The next step is interesting, because it shows the benefits of metadata use in action. Here we can see the claims that the RP requires, as they selected it from the list we made available in OUR metadata. In the generic case, however, it may happen that they would be asking fro claims we don\u2019t issue (yet), or we may have reasons for refusing to issue a certain claim to this relying party; in any case, Geneva Server gives us full control on the set of claims that your IP will issue.<\/p>\n<p>In this case, we keep everything that the RP asks for. Later we\u2019ll see that there\u2019s a&#160; little catch for \u201cPhone\u201d.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/cloudidentity.com\/blog\/wp-content\/uploads\/2009\/03\/image_d9c34045-4458-466d-907a-5c57d2b16574.png\" width=\"554\" height=\"444\" \/> <\/p>\n<p>Here we are. The wizard gathered all the info it needed for creating the relationship, and shows us a summary page which presents the info about this RP in the same UI that will be used in the MMC for the same purpose.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/cloudidentity.com\/blog\/wp-content\/uploads\/2009\/03\/image_f66753c7-5141-4425-9980-755e4882866c.png\" width=\"554\" height=\"445\" \/> <\/p>\n<p>We are satisfied and we move to the next step; that adds the RP to our policy store. We are in an official relationship now, and so much for my fears of commitment \ud83d\ude42<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/cloudidentity.com\/blog\/wp-content\/uploads\/2009\/03\/image_63f9d6ae-53d9-4de4-8969-4f716a002a65.png\" width=\"554\" height=\"445\" \/> <\/p>\n<p>Here there\u2019s our new default view: as you notice, we have a new entry.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/cloudidentity.com\/blog\/wp-content\/uploads\/2009\/03\/image_9a837b10-05fc-469a-b5bc-513b628e0c75.png\" width=\"554\" height=\"402\" \/> <\/p>\n<p>Actually, in this specific case we are not 100% done yet. The RP asked us for 3 claims: Name, Group and Phone. Name is a built-in claim type, and its value is automatically sourced from AD. Group is a claim we added ourselves, hence we provided manual sourcing to an AD attribute. Phone is again an arbitrary claim type we added, however we didn\u2019t yet specify how Geneva Server should assign a value to it when it is required to issue a Phone claim. Luckily, adding this information is really really easy. Let\u2019s select right-click-&gt;properties on our RP. We get to the dialog below.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/cloudidentity.com\/blog\/wp-content\/uploads\/2009\/03\/image_6668ac10-a3c6-4371-8cc4-18760f0ecc7c.png\" width=\"304\" height=\"341\" \/> <\/p>\n<p>If we pick the tab \u201cClaims\u201d, we\u2019ll see 4 entries in there:<\/p>\n<ul>\n<li>One Group entry for the Identity Provider. That means that Group is a claim that our IP exposes<\/li>\n<li>One Group entry for the Attribute Store. This entry contains a rule which tells to Geneva Server which value should be assigned when a Group claim is requested<\/li>\n<li>One Name entry for the Identity Provider. That means that out IP exposes the Name claim. We don\u2019t need further rules, as this is a built in claim<\/li>\n<li>One Phone entry for the Identity Provider. That means that Phone is a claim that our IP exposes. However this is not a built in claim, hence we need to add a corresponding Attribute Store rule for sourcing Phone correctly. Let\u2019s click \u201cAdd Rule\u201d<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/cloudidentity.com\/blog\/wp-content\/uploads\/2009\/03\/image_94515815-8eb8-408a-a544-ec5f00cea3c9.png\" width=\"604\" height=\"382\" \/> <\/p>\n<p>We pick Attribute Store; note that there are other interesting options in there, including using other claims as sourcing<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/cloudidentity.com\/blog\/wp-content\/uploads\/2009\/03\/image_07cd37c5-20a3-435d-ad9b-682fa3448382.png\" width=\"304\" height=\"315\" \/> <\/p>\n<p>Grabbing the value is TRIVIAL: you just write down the LDAP attribute name you want to assign. If you don\u2019t have the luck of having <a href=\"http:\/\/blogs.msdn.com\/donovanf\/\">Donovan<\/a> handy, the man is a directory encyclopedia, you can always install some utils like AD Explorer. In our case, the magic word is telephoneNumber.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/cloudidentity.com\/blog\/wp-content\/uploads\/2009\/03\/image_44fae2e4-5df9-4b07-ad12-c2deb3786afc.png\" width=\"304\" height=\"316\" \/> <\/p>\n<p>And we\u2019re done. A quick double check of the summary, and we are good to go.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/cloudidentity.com\/blog\/wp-content\/uploads\/2009\/03\/image_c0ebcd4f-cde5-4506-a7b0-481f3fbe5c27.png\" width=\"304\" height=\"315\" \/> <\/p>\n<p>Now our issuance rules list is complete.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"http:\/\/cloudidentity.com\/blog\/wp-content\/uploads\/2009\/03\/image_98f40460-bf7d-4444-801d-459939d75531.png\" width=\"304\" height=\"338\" \/> <\/p>\n<p>Our RP is all set: we can notify the devs at FabrikamShipping that they are now cleared for receiving tokens from Adatum, in the format requested and with the set of claims they need.<\/p>\n<p>Here our administrators did have to know what a claim is, but it was still astonishingly simple to set this up: as you may have noticed I didn\u2019t see a single mention of X509 certs or long list of arcane addresses, the only thing i needed was the application metadata URI and everything went downhill from there. In fact, I was able to go through this even if I am very far from being an expert in Geneva Server (for that you need to go to the <a href=\"http:\/\/blogs.msdn.com\/card\/\">Geneva team blog<\/a>, the <a href=\"http:\/\/social.msdn.microsoft.com\/Forums\/en-US\/Geneva\/threads\/\">forum<\/a> or <a href=\"http:\/\/blogs.msdn.com\/donovanf\/\">Donovan\u2019s blog<\/a>)&#160; <\/p>\n<p>Great! This concludes our little excursus in federation, hope you had fun. But I\u2019m not not done with WS-Federation just yet: expect still some posts about it \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>digg_url = &#8220;http:\/\/blogs.msdn.com\/vbertocci\/archive\/2009\/03\/23\/fun-with-federation-2-using-geneva-server-for-adding-a-relying-party-relationship-to-the-identity-provider.aspx&#8221;;digg_title = &#8220;Fun with Federation 2: using Geneva Server for adding a Relying Party relationship to the Identity Provider&#8221;;digg_bgcolor = &#8220;#FFFFFF&#8221;;digg_skin = &#8220;normal&#8221;;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined; After a short but sweet weekend, we are back to our federation chat. Last week I presented the perspective of&#8230;<\/p>\n","protected":false},"author":1,"featured_media":1406,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"footnotes":""},"categories":[23,75,73,9],"tags":[],"class_list":["post-413","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-federation","category-geneva","category-geneva-server","category-identity"],"_links":{"self":[{"href":"https:\/\/www.cloudidentity.com\/blog\/wp-json\/wp\/v2\/posts\/413","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cloudidentity.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.cloudidentity.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.cloudidentity.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cloudidentity.com\/blog\/wp-json\/wp\/v2\/comments?post=413"}],"version-history":[{"count":0,"href":"https:\/\/www.cloudidentity.com\/blog\/wp-json\/wp\/v2\/posts\/413\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.cloudidentity.com\/blog\/wp-json\/wp\/v2\/media\/1406"}],"wp:attachment":[{"href":"https:\/\/www.cloudidentity.com\/blog\/wp-json\/wp\/v2\/media?parent=413"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cloudidentity.com\/blog\/wp-json\/wp\/v2\/categories?post=413"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cloudidentity.com\/blog\/wp-json\/wp\/v2\/tags?post=413"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}