crm on premise IFD 部署下提供oauth 2.0 集成自定义应用
很多情况下我们的CRM系统会和弟三方应用集成,一般情况我们会开发一个中间站点来提供web api 给弟三方应用。
参考:http://alexanderdevelopment.net/post/2015/01/24/authenticating-from-a-node-js-client-to-dynamics-crm-via-ad-fs-and-oauth2/
利用adfs 带的auto2.0可以有一种简单的方式和弟三方应用集成。我们做的只需要类似像和微信、微博、QQ集成弟三登录功能一样实现 ADFS oauth 2.0
弟一步 在ADFS上注册一个client ,生成的 ClientId、RedirectUri (指跳转页面),在ADFS中没有密码这个属性,在请求code的时候 会用这两个属性代替clientid和密码
Add-AdfsClient -ClientId "aa106265-fb3b-49e0-a0e8-6840b3d71ac2" -Name "hongfu dynamics CRM ADFS Client" -RedirectUri "http://localhost:21313/Default.aspx"
弟二步在我们自己的程序中注册登录代码
逻辑比较简单
1 用户进入登录页面
2 用户点击登录,页面会跳转到ADFS的登录页面,注意URL
3 在ADFS实现 登录后,回转到我们之前 定义的RedirectUri,URL中会传一个code参数
aaarticlea/png;base64,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+BkzZly5csVXsdwqr5j54iu/GzVhwrTwqS+89uTTsx8fO/mRP4x57PGQ6bNfSty63VRh6U1h5bfBEyZMnzvl+VenzV085flXJ0yf++TTc8jjt8EmK278IqxseEDZPvaftof8807Hd8589LMdE7+9PeSftz/xT9rSlcXfVaIGeyustLS0XK6+PP7oeE1eWZW/yvsAuTQ0NMRtSHzn/W3ul9dmZmbqjx1I+o2wwjeK1EEMQ2rnWI52S6cGu175J9yYoTlvtMsx3aMhJjFqJgfQFenpommCXfwrrPTUXM97fCes+CYKHkzh56XQszXCKkMdNZEdTGOj1aK8lMiUFM+Kks4mqymioq9ITzHII9yZoxu2wIgryVO+aF3mFYObe5ajtt6EeqKxsSWk5qXocqLBflEH7pIDmBLxVlihFAF3hbDZaphTojbgqoSCSBnMSpe60O1ZnlHWohaepnKIF7tFhEKy92wpqLxv59aQjJmjD0//456QMekzQjJmhuwfNf+Lue1d7YeLD4XsG/HrA9u2FFSKQliyYj33p8idQZssqaqalJS0du3a/fv3q6qanZ1t3C+j++RiKqxUV1dHR0dHRkampqZq32aurq6Oi4vTBSv55Rq2hJVNmzZt27bN6L5t27ZNmzx544xMVlHLj6x568B1VVXVltOJ5BKW2qyEpXuLbEd2MYXWUtyCycUUicZCqyVmMbjCqfp6LUSVgY91YSU9PX316tXz588fN26cJkCMGTPm+vXrpaWlISEhmsu4cePmz5+/evXqI0eOcAORzIS1EHJycnJyckTqRk8IH70grJw9e3bixIkzZszIzs6eP3++Fsv8+fOzs7NnzJgxceLEs2fP+iQixzOzH39yctisV6a/tOTZeRHT5r4x5flXHc/Nf+rp50eOf+ZXf37qidCpBYWXJSGICqich5fWjhz/zITpc8NmL5gxb0nY7AUTps91HjPmTp6zYMa8JSPHPyMPodes3RriFlbW/UTZPeXfTq4btiP02x8//g8pE759ct0De57+t7jBSuS/K/P+TokZ4gNhReNKzZWpx6aeKD/hqwAZsk6efmP5e2+/l+gWVioqKrg7Y/u5sEJDCw3xkfHpFbLBODWLteufdjEONU0f2Hs6hxYIK3wfHgFhhU9/EFboZ8l5KZHx8ayDcbInuNocutqTV+sLuTwoS/oqiykS6JTk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" alt="" />
4 在登录面的onload 事件中读取出 code,去adfs请求token
string url = string.Format("{0}adfs/oauth2/token"
, _adfs); string body = string.Format("grant_type=authorization_code&client_id={0}&redirect_uri={1}&code={2}"
, _clientID, Server.UrlEncode(_returnURL), code); var requestJson = JsonConvert.SerializeObject(new
{
grant_type = "authorization_code",
client_id = _clientID,
redirect_uri = Server.UrlEncode(_returnURL)
,
code = code
}); HttpClient client = new HttpClient();
HttpContent content = new StringContent(body);
content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
var tokenstr = client.PostAsync(url, content).Result.Content.ReadAsStringAsync().Result;
5 请求完token后,再使用token调用CRM webapi ,查询出当前用户和客户信息
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABFgAAAFvCAIAAADxJuhAAAAgAElEQVR4nO3dq47jWKM24FzQkFYF7Atp0CpppJFyC00n0oCGQX0DhQYMaxD8qdiQBrNhgV138GujIRvkB0nsdfQhlThO8jwyqHKc5eXl03pjx1nsAAAAHszi2hUAAACYmiAEAAA8HEEIAAB4OIIQAADwcAQhAADg4QhCAADAwxGEAACAhyMIAQAAD0cQAgAAHo4gBAAAPBxBCAAAeDjnDEL/91//ZTAYDAaDwWAwGGY+nDEC3C5ByGAwGAwGg8FgeKzhjBHgdglCBoPBYDAYDAbDYw1njAC3SxAyGAwGg8FgMBgeazhjBLhdgpDBYDAYDAaDwfBYwxkjwO0ShAwGg8FgMBgMhscazhgBbpcgZDAYDAaDwWAwPNZwxghwuy4ehP69O//93//9+++/n7HdAADgQgShmosHof+9O7///rsgBADATRCEagSh0QQhAABuhSBUIwiNJggBAHArBKEaQWg0QQgAgFshCNVMH4T+/LKIfPnz7z9+WXz58/jiL3/8XZ84eedU2Sdyi0Ho/f39VmZ63qqGpV2lEbhjs9uiXtfPL+/nKuwSSze7FjufO140uD8PuMMKQjVXvSL055dDmmnyzi9//P333393vSd4bxqE/vo1SEmfvv08jv/57VMWotqX9+/69a+oqP1bkpE9Qej95fnp6elp/RqNfV0/Pb+8795fnp/SPsrr+imSvHOY13XfG0uzvrjTZhq8q7vdopdqTRC+93yN8P7y3BQU/n2j+refi6mtk2x8sKPE05/Y/ocNqKuQM+5WPZUMFq5nPby/PGeTtIWHR5OPb5Tj95czttjr+lhS89d+6ZLy90fcZoLJd8Vjkz+/vHZsyrHpjxdnaZnoXBXvPE+p9uXetRbPIBz3uk4a67j1nHjAKs+1/z37d3Qv5uyNPJmeoVsyxf6YzaJ0gKy8JWiK2ruaDW1E63XL5xS2dvPKCVt4sH3W3vm6fnpaC0I1kwehv//4ZZ9+/vwSXtRpLwU1EzT/DLki9PPbpyi4/PVrG2R+fvuUZJqf3z41UeivXxefPiUT/Pz2KRvXF4Qqm295V8kO87Uc1UsQmjYI3VkOul4Q2m/veful46PTXVzbs7R/uZDz7VadlXx/eW7m011g+fBwLLztJX6gr5jO7lpBqG2xKOY9PyfdiPeX52zclIIl7sr0Uf1e1yd3La8m3Eh3u3gZ8r5d2BQj1lp+glyv1/G+3n207/a6fnp6fh65TcdBqL6Ys/eBk+nreraR74QgFE06bRDKD+BR0wY72egtfMCBSBDqcZUrQod48+VL8ca3YXe8RVeEwmATRqH9uDwI7ePP/g1//br49O3br+EUP799+vVb4U19Qai0BR5Ht59ydmys6SknCPrlj8ifX16CvSb+3Gr9Go8qfbZV3t+aaaKZFivzuj58Hhq+kH8+UXhvcih6Wr9E78rarW3f9KXXdfTuvA5xyWmd45NteQnbZgjWY/B3ocXeX573a+ep/cj4Zd3O83Wdzb97FYwvsLquK9vPadvAe39N8n3j/eX5eb3O94N0fOcpptD++WwLKzrNVsH0pWb52G61Lz85uR3/jUbXzsiHsp/X6+z1Q+WDbky2unq3unydDl+6S7RYkByjS0PPLy/rZLr1S9NkwTrt3Xfei0tdbova6PAq5XP149jCKq11OY+TFo+otVYdsoq7W6Z6jsnqG2i7cKVtNjlSd621WlPtt4HkWLsvtHi071uUfVsni9LbdF1BKDmKDN+cqmefMWfYjqWtzvM9Pnntyi9lvfB2RPxS0vuuzbJjex6zD3bOInxncDQozHT/lvhYFK3b0gFtRFekcxdLDuCFyFncwvu2kHirjv9LF0cQqrlCEIovBWUB6fgdoc6LQYFf/vi7lIMCA4LQz7+CJPTz26df/yq96ZQg9P7yfOgIrNteRmGnyT9biFJR8OlB8pHbU/E4FXxql05fmiZZkLbvEp1CC5UJK1CrZLRvBv8cZxR9AhwUELdbvUnH1iGavl2wsG2qH8oUc1C9xeIPfILJSytnyCoYUeDQ7eGj28C4RTuWdDgfZWeyZHxlrzq+1r3lV1Z0VGhTyIV2q2IHI2re3g/z3l9eKr2xrAUKQah71dT2zSFLd/YWC8JF6Pnl/bDKwr3v/eV537VN1umAfae2JZePALVDX9oVrBz9i+EoT0LNlLWjWaVVBx0H6i3Te9Dr/CRiUBDqWmuVog5nhORUWdipk6N9cTUFNcr7jJ1NNzQIVXaictvWDkojz7D1bbVQk5En06R7Xt4+mv+qi9lWtO/s3NdoPbMIlqVnI2nekhzqOg9op7ResnS1A3hS+UKLJVtIJf4USikujiBUM3EQ+vuPXxa//PF3R8j55cuXXxaL+JEJwZuLAeqvX2vf56kEofZqUROJ2iT089unX/8qpqeuINRzwginC/qPwa6a7kHpXtP2dYqfLacqB8fKNH0ja5WpHRxr59qkrNf10/r1dci1si4D6lDvhFUbtjarjhwUKZx0S2eU0pvPXuCuusbOsA2MrUmzC6RruzB+/2f70V5S8+LqivscpUUNzqC1lXiu3eo1vKZR+HN33PmLeTSWnUeTrTH9qHDAqqnumwOW7kIt9l64Ma5ZZa/hJ6/r8NPc1/az2UH7zoBDa/fEJwehYgvGfbjS0axSRv/e19kyvQe9ngmK4Tz9GKO+1tJZNaeM5hzZniyrO0/TDuXVlB5PorNNZ9N1BaEkqpR2onLTVXabsWfYQWuzs+dd1h5HntIDypiaxEFowLs6G61nFvni1naiziA08IDWYfTOEr1U3sL7j9VBCU/x1a+sGEGo5joPS/j7j19KSScbHz9ELvr2UDjxgCCUaic/BKGf3z41N9Id/h8ThEbnoHgzLXwqke7mhxcKvcfsABr3GvOq5dP0LUilMkNCyHEHLR5bo3PRhEEobcGmA97dJS3moI7PZipL9rquHq7OXmC6rvu2n3oFatvAmEXbJR3duHeaj9+vknaiOE3kXZN4q66t6LDHVVmJZ9qt0qiSnnDDXmPvmbdQp3TypgrZ6b64aur7Zv/SXepAFEXHsPEO21rURc6C0KB9p3o0Kx0BqhN/PAgVu/HdQShrsf69r79lug56A/p2qazt6mstm9exxm27HvfYUmIpxL2wYoWdoLrSSk0Xn5Vri9m9E2VtWzkonXSGTQrvPNUOVOpud0eansUsv2tkow1pyY8GoSFnxm593ZdaiUkvqLyFDF25YQtniyMI1cw7CMV3y+2vI+3/+fPLYvHLH3/unzBXvjXu58+fbRBqMk34FIUwCAUB6Pjv4CA04rOD19KdMknXrPPIXt9dD+fI7GOqJAMUp8lmk1f7I0GoenTY1yc6kl8vCEV1Kh1kijlotkGovK6vHITeg0/5k/VTGp/VJPz4LooYpa26NwjVV+J5dqs4qhzGxzmoa0tMJKuqkIN2h4/Siyu7EoTKM+xfugu0WNjLT872x8q3Xemm13TGINS+3tbu7EEoPSyt40skHX24Uqt+NAiVFrlW22Ds8cnD0QK+ruOeav9aK7ZWfph9j68NjgpCpY2qcGbqD0K1xew9acVte64gVCj8tNNnXtn8A6ZCn6WzJoOC0IhG657F0S0GoSBoBtWtBKFBKzc4pgwLQnnEfEBXC0IdX/kpTP3ljz9++eXLl18WX/44vDW6R66UhNrnyKWZJs5CzbeFfn779OnbX8GFoUteEYo39vh0Vzj2Bq/kEap4Jij2P6rTBIoja5UZEkLqMfH9+JWQUlwZ7oQgVGzBdIHTmiSd9c4O/0eC0HkKrK3rIUs/ahsYm/Ey68qlicJShGet4jyj2fbtKh0r8Sy7VVh+80L4TfGPBKG08EOBUU9zyEZS3jcHLN1FDkTBUkVBL+zBPL+85rdMHScYuu8Uj2alFqhPfFoQiid9f3mON4mBHf3xQajjOFyuWsfI9+Yj7FLrRMvSvdbyCgSTHYtYv4RjKu0z8HR5eKXZS04JQuli9jfsrhpsCvNKCu2JH1Hhg2rS7fQglC1mVxAa2WjFkdlm1K7DU4LQoDNjt563lCpcOGxU6lErPB3f1VF0Rajmer8jlP4QUPUbQPsfGfryZzNF8/NDaewJslD347PDV9vHJuxvoQv+ucB3hAp73b4TeDwYtttu9F+wy4Tj9x+RZLvxoV+Z7fPVaULFLFarzNAQEp9lkuNY6fA0wilBKGrB/Ig9Jgd1tNiJQegsBXZuD4XtZ1gFCtvAuEULdPUew5YurNz3WtcoWtLKij5WMl6J59+t8qhyeDFennzP6Giv8OgQt8Ch+3HsDw3r6tX2zUEHjUsciF6LN8aFld9PnnZiSh2v6r5T25LLR4Daoe+kIBQHhV1lk+jpOIYtNjwIFVum76DXzC453FUaNnm1d62lXtdPz8/RXvP+8hyP6Tra56updAwKI+6JQShvhMJOVG7b2kFp5Bm2Y1sdfEApSRssSQzRInfVpC8IjWq0ylaa95cKu2b0X2cQGnRmHNp6pW284wyeFlLdQirH6mhh6x1FQajmmj+our+9Lf/xoCQCNdeIgqi0v6SUvKHrB1ULT407ZKE2CEUXls711LhUfA46nM+CP7OJnwovNeOjp9YeS9nvRWnSao9apWmi2rezLZyy48rUjjjJCT54b+kAH/fLqh98VNp3UB2Cv1/XT0/r9TpblrBx2gKP863noHKLjQ5CfavglAKL67pj+zllGxi7aFFhvUEonmm7RUdvrCxpbUXvq1PNKWfarfLy01N3Wny8KRbfHKzB+PVw2y3G/2pGLeybA5buEi0WLlaygEHl0883sk2sd99JlrrvCNA1cdIQcfKI2zZ7f/DOOPKVj2bVFhsahMo7dedBb1eaKnyp1N9rO3K9ay2bURYUh7dPYTVVjjCHIj8UhJL+anknKrVt9ewz9gzbv63WOyTdJ9NYuNyvbb1fo5VYWszuIDSq0WoLG40fkJbTZP60Th7dUT6gDW692nmzfa248PGiva6fggcE1baQ2imys6MoCNVMHYT+LP50UOkOuT/aByW0b8quIZWfL3dRHwtCHZ8ENK+O/iCCMUqfEnKHHm9FJ4/PZv7ql0e4R/M4KBUeBc39E4RqrnlF6EbVg9DgA1zluuvruutTHM5kHqciLs6KZu5K1w25Y7M4KMlBj0kQqhGERqsEoa7buooG3DbBJcziVMTlWdHMWPS9GR6EgxJXIwjVCEKj1YIQAADMjSBUIwiNJggBAHArBKGaiweh3+/UGdsNAAAuRBCqEYROdMZ2AwCACxGEai4ehM5YPgAAMIoueo0gBAAAd0sXvUYQAgCAu6WLXiMIAQDA3dJFrxGEAOCa3t/fr10F4J7potdMFYTC31Pe/6J2o/1p7eCF8LeXq9MP9bruePP7y3P+S8/FkZUio+nauvZUMyigXFJ/mWPHJ3Nv5lZp9h55E1Xm27P6BpdTXIrnl/fd+8tzNmX60uH/rtmeoFZI07wjanhCQ4WvRFN3bvDl9/dsAOEGcyx9wBZuly8XUC6pv0y7/JgdKq/K+A1pvOxQ0y+s8wlvb8o437FoxBYSbVgDKzr0aFPbZU7aleIpartz12KOmH7gMbk9lr4Ma8ZhrT1oZx+4RNX11X+W6a/s2LVQOlB0bQyDDyx9Cgtb36H2E09xsBlJEKq5RhB6XXcfsdOjSGX6gaITS7pnHvaT4lm5Ps/3l+diVcPxr+sxe0J96lqZY8fn8wsmKjZ7l7yJ6vPtWn1jyikuxT0FoXENlbwUtXd9gy8YtAGUN5ih5drli5W0y4+of1PyiN786zqe0+t6nv2T4Wuhu4yzHYvGbCHjgtDYo006uvSGjo2mMrva7lyTTt+3wEOPyeMPq6OD0MAWqBVaW1+DzjI9lT2pVfsOFMELpx+c8zILC9uxQ+3O1ME4N0Go5uJBKP+8o3yWjDen5Gw2bIMKPrpoSqof5Q5TP6/XwQZbHJnJPm/Z/5PMK9x7mqpV992Oz7NKZY4df5xNujrqzZ58ltrTRPX51lbf2HIKbXh8tTCL9KWuIFTabmqj31+e96339PT0/PIaHuxKzZvVsK1H6aURDRW8+rxexye42gG/fwfJ4ki6RH2f4JUawS7fU15eS7t8XJ9TdvnydhCMjffl90pzVZvldX04ApSrGL/pKdhgknHJJ+7F5c861fl8o47Xx45FQ7aQpGP40tQnTbgd+2bv0SZdv2N729XZVXbnqNLxKk2Xq6tTPfCYHB9L682YL215sjE7+8Alqr29qwX6dqJBrTrgwJ6d0tMyhxxYqpvsgBNKx7Gop4muRhCqmeaK0H7faE4Fz8/Fnmcr+eiid/pdYTdqdvjKW95fXppTU3BMLIwszqvwMUkyr7aM1/JhqVTzVK3MsePzD0rLnepomvi82ixwqYm65ltefSPLKbXh+8vzYdS60KjRS/UgFC5o+3dlc9qv+uiFzuYdUcORDdUU8vzynsy8f5+qbXPJflfeYOodj9pb7PLveWl2+b5yPrbL9/ft4n05+yj5Ka1G0izZTlHeJqrdz6Co4g4cbnJJ+aX5nvNYVG6vylYd1SeodPcukIzv3VaHddW7pLMr7M6VQ0o2j47sNeqYHBZUa8bCO0qTjdvZxy1R9vZhZ5mwGoWNoV6HYQf2wgE7LrL/wNLUsvOkX1vYrr1GELox098aFxzSd8ejRlvGMZEXz0+F6XfBVOFecdjq91tj+/FZ5eiQje3uFR1nGJeYbvnN/90Hmb6DarHMsePTuZSaq6vTWahk0puszLd/9Q0rZ8iBusuwIBROXtqc0grWCjmltuMaKpooCWrFDb66RO2/XR/XJWfs6jm6+Ba7fHfNs3rY5fP6j9W/mXZ1m6o90XirjuJcO77cLvWiSr3mdHtspq7M95zHorbmXceE8gyO/3bNd8TRpmcpBi1deVPPd+fqQTIZX48p447JXYfVgQtcae3enX3EEhXePvQsU9lmy5Vs6tB5YH+PRudrtH1j//Q9lRx+QinpadLrEIRqpgpC1W5GZYcf2tsKis8cPpfJLuN3nN07R0Z1yA8pQ3sq2Yw6Pjc4V6+oNH7IeaU5WZQ/ohvQK+qZwcByPvzxSj0IBdtOVI3S5pQ23PG/oc07rsJdDbULe5jJSbe0wdeXqDzbjiWq7ZqDG8Eub5e//C4/LAhF1SjmjuD/uFkGBaHSUuRFlYJQesSqBMRsac5/LKodE9qXC+tv0OobcLQJy8zeP3IbqXw0EzVh+SAZXDaIr3TkFRp+TM7+HNhtH9Da/Tv70CUqvr3rLFOqRn3LKdSh68De1UJj/093ww+cUIrmmIQEoZqrB6HaCz3jo612/Tr4SJkX298rSuZVPWQVxnccBer165nX8dOLMeMHnx3Dgp7a/b+3N1mrT7X8ceVcMgi1UzRLXJ/dZEGor6Hegw/ak5NuaYMf3ICV6UtBqGcftMsXlt0uP7Scj+7y/dvHwCBUa5YBQSjtC9WKmncQ6jmGfCAIDTjaBEUW3925K1VmV9udO+vc9pv3x578iDT2mLwbEISyJfpYEIpeGLBElbcPPcv078uVOtQ+URm1kVSnL++GHzihVJ1h5zsrQahm8lvjCp+0FQ7v9SvsWY82KT8f/+FeUU+ZzY6SvKmZrOMjhMrSVCvSTD92/NBr1kGzp5+edPaKhi57vsCnlTNWKfcUWv64Lquzq9S21rzDjWyo6IzVcaIMz/21HWTIflf+FLOzKLv8kKJydvnz7PLlApIOai2PtRGm2iy9QSiNQfWiSkGomsx6gtBljkUdx5DK/IoTjz/aHP4d0jMetSC1zzWGtFXlUDH6mNx1WB14vO5rwFoLDFuioQ1YO8tUq1FS24Brlcz3ps7DTHRgKe6Gp59QqsvzoQ9vL0AQqrnKwxKKp5+x4xPvL8/J1e5SN6H37N41stGWHv8TnvnCaeIz3riTVK3Mj47vWR1hzQ4H+O7DTNd8O1ffwHKqbThQ3CsJDlLpkgadmN7Nqf2v1rzjKjimoZJXoo8iSxv84B2ksjH3B6Gx25hdvswu/5401akfrL6u4x3xdR0uVMdHykFzVZulJwhlMaijqFIQigsI2qUvCF3wWFRcI9nBoWvi0UebbIFbA3el2oJUd+f8hewA29/BHXRMTv8s7gb5QpcmG7mzD12iwYfonm2vtDFU69B1YK+1UGljqEzfuRuedEKptdzccpAgVHWFx2cf95Dw8uRe8JFKNL42fSL8RCb9wKd+ufeEXtGgRaiMjkrt/Uirq8zTxyero9zswRKuXwt7f95Etfl2r77B5VTaMNTdnkE9smNoYfsobk61ILSrN+/wGo5tqPCVIRv8gB2k3OLps7Dra6DWCHb5thS7/GS7fFyVQul5UmmbK05FWbN0B6FwC2xnXmvhw9Tr13iBiqupNwjtznEsquyYhTXyun4KvkveM3G95Hqda/UcuysNO8JUDikDD0hRMf1HpDgIVZoxX+jyZON29sFL1Lu+auu39gz69JOJUh36D+xJnSsbQ3n6+oHutBNKrdkEoZsx1a1xMIHykyyBO3WhXX5YLxugQBC6KYIQ90MOgodytl0+utdmlr0Y4FYMvINuWrroNYIQAI+udlsMwHD7W+9meAzRRa8RhAAA4G7potcIQgAAcLd00WsEIQAAuFu66DWCEAAA3C1d9BpBCAAA7pYueo0gBAAAd0sXvUYQAgCAu6WLXiMIAQDA3dJFr7l4EDIYDAaDwWAwGAyzGs4YAW6XIGQwGAwGg8FgMDzWcMYIcLsEIYPBYDAYDAaD4bGGM0aA2yUIGQwGg8FgMBgMjzWcMQLcLkHIYDAYDAaDwWB4rOGMEeB2CUIGg8FgMBgMBsNjDWeMALdLEDIYDAaDwWAwGB5rOGMEuF3nDEKh33///ffff79Q4XBz/nekf//9999//712rQEA7pYgBFMQhAAAZkUQgikIQgAAsyIIwRQEIQCAWZkoCL1tlovFYrHaXmh2MHOCEADArEwThLYrIYjHVkw7v/32myAEAHAVkwWh5ebtQrOCG1BMQXuCEADA9AQhmEItBdWykCAEAHBRkwSht81SEOKx1a4F1bKQIAQAcFFTBCE5CPIgVPtXEAIAmMDFg5DnJMAuC0L5nXKCEADAlFwRgink3wLqJggBAFyU7wjBFAQhAIBZ8dQ4mIIgBAAwK4IQTEEQAgCYlcmCkCcm8NAEIQCAWZkmCO3eNsvFQhjicf0cQxACALi0iYIQPDhBCABgVgQhmIIgBAAwK4IQTEEQAgCYFUEIpiAIAQDMiiAEUxCEAABmRRCCKQhCAACzIgjBFAQhAIBZEYRgCoIQAMCsCEIwBUEIAGBWBCGYgiAEADArghBMQRACAJgVQQimIAgBAMyKIARTEIQAAGZFEIIpCEIAALMiCMEUBCEAgFkRhGAKghAAwKwIQjAFQQgAYFYEIZiCIAQAMCuCEExBEAIAmBVBCKYgCAEAzIogBFMQhAAAZkUQgikIQgAAsyIIwRQEIQCAWRGEYAqCEADArAhCMAVBCABgVgQhmIIgBAAwK48ShN7e3m5lpuetaljaVRqBPUEIAGBWLh+EtqvFcvO2e9ssF8tN3BHfrhaR1faEOW1XfW8szfriTptp8K7udoteqjVB+N7zNcLbZtkUFP59o/q3n/MQhAAAZuVaQWi7WiySjvnbZnlKGhKEpg1Cd5aDBCEAgMc0WRDabVdNf7PeKX/bLKNu6SEcLdLU1FxLWm42QUc2mPwYqYJR+6kK05Srkc20WJntarHcbJtX9i9kMy29N2iF/WJvondl7XYckTfpdhW9O69DXHJa57YN6kvYNkOwHoO/Cy32tlnu185icZhd8+9xATvWwVkKrK7ryvZz2jbwNmjRBCEAgFm5fBB62ywPiWTV9voL3ef8CkiUirarRTj+2AvddzmbpBD10cPoE05fmibUTJNeUSlVJqxArZJR8Isv+ixW2/DCSrz0cbu10pfG1iGavl2wsG2q10mKOajeYtFihyuqtHKGrIIRBQ7dHj66DQxbNEEIAGBWpn9YQtPrD7uVQf+x6T4GgamZ5nA9I/1wv9Rlb8fXL0AV31scWatMMnVxpmmBQVnb1WK1HXStrMuAOtTTYLVha7PqyEGReFmyENEVuc5e4K66xs6wDQyriSAEADArkwehJgfFfc22kxl+8yW7K2m5eUuzQql7Gt8MlaeLfJpsNkm1K5UZEkLi+7OS+6qSewEnC0JpCzbRs+NutV0lB1UqHa+YaKKwAoXMcdYC03Xdt/3UK1DbBobVRBACAJiVyYNQ9L2WqLuaXj8ZHYS2qzBjlPNAbZpsNnm1PxKEquEmuTXrukEoqlP6LIvDK5XvB80xCJXXtSAEAMDuileE4l5l22WMu/Fjbo3Lv9RfvEutPE3g4rfGpY3RfkXourfGZQuc1uSt8sC4+p1spwWh8xRYW9cXuTVOEAIAuDHXCEJpf7T9snl8o1jXwxIKXy4Ku52Hm7yySzLVaULFLNb1sIQhISTuHidfgmp6z9MFocLDFdLGGZqDOlrsxCB0lgI7t4fC9jOsAoVtQBACALhBV3lYQnwr22K5eavdjRV8vya7K+kwNnj8cfB1kNU2S1rR/VLZNNH1g/KXZYqVqYWQaKbxF4UKEar5O35XJL0zK3qlvw7B39vVYrFarbJlKX936jjfeg4qt9joINS3Ck4psLiuO7afU7YBQQgA4AZNH4T6Lnskjw/g/Or36nEx/zuSIAQAcFHXCEK76h1J21XxXjXOSxC6AkEIAGBWrhSEdrtd6bnSMtAkBKErEIQAAGblmkEIHocgBAAwK4IQTEEQAgCYFUEIpiAIAQDMiiAEUxCEAABmRRCCKQhCAACzIgjBFAQhAIBZEYRO9/bmYd8MJQgBAMzK9YLQ22ZZ/N2gbPz+x1cLvzP0tlme8sND21VYTrGQ/h/aqdUeygQhAIBZuVYQ2v+Yah4l0vFRaonzyYk5KJtfoRBBiHMThAAAZpVvTDMAABeuSURBVGWKIBRfgtnt9vFjtcqjRDq+M25sV8ewsk9PR8cEs10tlptt81ITbNJsFUx/vO60CYJQofBg1H6qcgWgJQgBAMzKNa4I7a/C5CEnH59HqFYTYaLLN9tVk0T2wSbMSs34ptCmkGSuUSGlwtPpS9NASxACAJiV6YPQ8Wa0NAgVxu//3KbXX3a7XXQpJ9KmkuT+tubfIAiVw1T91rh2fP1aVf9tdTwiQQgAYFamDkLtd3LiKFEcX/jC0DFjZDkoeKRC4cpPWG47vng96Ph/WHxeeB6E8mmgJQgBAMzKtEEofDRBGCUq47O00QSUMAcdEkgbboYGofhLRuUgVCs8v5UunwZaghAAwKxMGoTiZwq0V09q47PvCB0DShickmmG3xqXFNJ3G108WRCEqtNASxACAJiVmf+OUHyP2jFjRM+8DoPHIVE1F3wW4a10SXCJH5wdPEwhfGO18DgIlaeBliAEADAr13l89m43/AdVw8tFzdWY2i+urrbR1ZzFatU+Ezv+aaL8B4SaGUWPz64Ufpy6mVNpGmgIQgAAs3K9K0IXJ5AwI4IQAMCsCEIwBUEIAGBWBCGYgiAEADArdxyEYEYEIQCAWRGEYAqCEADArAhCMAVBCABgVgQhmIIgBAAwK4IQTEEQAgCYFUEIpiAIAQDMyj0Goe1quXk7V2Fvb2cr6qJlTu8+lmIyghAAwKxMFYTeNsuudLJdLY56fvrnbbPMJmkLD8pZfDwNvW2WI0vp/+2iwWVuV8eS2r9mY+hSTF717Sqs1+G/Um07Xho7l2EEIQCAWZkoCHXmoLfNsokP3R3Tt82ykJWOhR/fu78idIbfU71mEGpbrCdDXsWgpShl1ssLm0sQAgCgYqIgtL8ykMSE47/R6Frv+ZCBlqtV9vrhskPTp01ujduP36zaK07bVXb16VB8cCUpGLOfLBixyJbj8M5NsCiF6YeXGXTnw6sqtemb8eGSF0cWlnSXBrj2v+1qsdxsm3fs35AuRbHEuN7FcupLdOIqC2f2Fv5VuDAVv1TZMmsN3syh1m4FghAAwKxME4SOHdGop9j8M+iK0Ntm0/RM485m08ttg1Wh599OEvZx255985bgn3B8VvWslLj0odNn04R39wWyi1xBmVFLZoWHI8Om3m1XiyAx1IJQ2/8Ppg/KDN8a/B2vp1o5lSU6fZUdC2qmOpS3Srep5KXyltnR4IIQAMBtmyQIRV93Kfy5C66q9N1LlQWh5MJD5ZpDoateviIVzqJ+31S5q1zvCseXGHrK3A27Ma5Wh46apI1XKSIOQqXxlSAUzyn+ss6AwFCMxuNWWTPZ2FvXqltmaRJBCADg5k0RhNKokna9gysE/d+yKfTlC3c9pXdypd8aCWcV3/0UvjUPLeHlmuh2vHrtkvuq+suMlypfvr46NBXJs0AaEIK7CU8OQkH71RNhd2DIWuD0VdYuV1+iTtVzZb6CBCEAgJs3QRCKu/KHzmKcg9Is0fFxfv7Zf+FiSNS5H9KrLs8wv+0tvQxSD0Ll6QeU2XNrXH8dOlrxIkEoeLGtXTKn7lvvslY6fZV1LX2PfMusrkRBCADg5l0+CKX3dm1Xi8VqE8SZjwSh4o1jhyB0nLKvV13vv8Y3gBU79rUrH9UgMKDM2pMSBtYhLa3aeOe5Na7cYsOuCNWW6PRVVl7OYfq2TEEIAOCOXDwI5VElewZ2dmtc34f9zVujwpt3to/Pzm9wK/Wq9zUq1KDyTZjjA+zaR6gF9/gVkkU2fV+ZlRvjuqYPAkr2TZdgZO1hCenzKk78jlDlYQZdQai4RKevsvwtI6RbZleD52s/bLcCQQgAYFYuHoQKl2yi3vhecD9Y3H0uvjnonNa/bhN9h6W7V71r+rlJDcKecVB2cgNV8Jjq4PHZten7y6w/KaFah+L3dIojq0+dbsreP+e6OwjVliLKqNVrJdu+VvrAKkvfEetJSNmWWWnwtEpZuxUIQgAAszLR7whNKnl8Ntdx4mWZy8648CDtiQhCAACzco9BiHk47Zs6Z5hrPX9dLwcJQgAA8yIIcTnTR6GrXYbqJQgBAMyKIARTEIQAAGZFEIIpCEIAALMiCMEUBCEAgFkRhGAKghAAwKwIQjAFQQgAYFYEIZiCIAQAMCuCEExBEAIAmJXrBaHDL768bZb5L79sV4vFYrG4ws9xwmUIQgAAszLbIDTTn8WE0whCAACzMk0QetssFwdNwDmGne3qcOEnSD+CEPdGEAIAmJUJglB0zaf9522zXG13u93bZpVlHkGIeyMIAQDMyuWD0HYVf9fnbbPs/e6PIMS9EYQAAGbl4kEouCuu1ZdyBCHujSAEADArkwSh0aFGEOLeCEIAALMy/a1xQwhC3BtBCABgViZ6WEL0sLj+kCMIcW8EIQCAWZn88dn1hOPx2dwxQQgAYFau94OqXQQh7o0gBAAwK4IQTEEQAgCYldkGocViMf4hCzBXghAAwKzMMwjBvRGEAABmRRCCKQhCAACzIgjBFAQhAIBZEYRgCoIQAMCsCEIwBUEIAGBWBCGYgiAEADArghBMQRACAJiVmQaht83S7whxTwQhAIBZmWcQ2q6EIO6LIAQAMCuzDULLzds56wPXJQgBAMyKIARTEIQAAGZllkHobbMUhLgvghAAwKzMMQjJQdwfQQgAYFZmF4Q8J4G7JAgBAMzK7ILQzhUh7pEgBAAwK3MMQpIQ90cQAgCYlVkGIU+N4+4IQgAAsyIIwRQEIQCAWZltEPLEBO6KIAQAMCvjgtD//dd/GQyGswyCEADAFQlCBsN1BkEIAOCKBCGD4TqDIAQAcEWCkMFwnUEQAgC4IkHIYLjOIAgBAFyRIGQwXGcQhAAArkgQMhiuMwhCAABXdIYgVJzyY78jNF9vb+f5nddzlcNNEIQAAObmdoLQdrVYbt52b5vlYrl5S1+KnPRbrP0/4lqa9Sk+UE53IwQvpUuzXS0W0VuiIt42y+Vmswre0TGjdNzbZnlo93jKdnxbbrqmSmsrLH/I9LdAEAIAmJtbD0JZB7/pgI/tL99XEMqbabUKg06eg95221WUWMoz2rdu+Nam2bar4IWgOavLG72hXH7v9LdBEAIAmJubC0Jhd72eKML+efN/4bJFc8VhudkEQSiY/BipsusbhWkq9YjmO7ycUt2yRjiOyF562yzbwvZJpxB0mn+OpR8nKLT2saDVqm31PG/t/4vHl9dTKXmm5fdNfysEIQCAubmdIPS2WR4SyaqNFME1h2PayK9lRKkouKqQ34PVhIvkZq42soTTl6ZJahxfOqnMt1ROUs0gjsWNUG+fuHmOTRI0WDjb9ppOO0E+o305SfXTu+R62qFrZF5+TyE3QxACAJib2wlCqUPvPr87K7iEs9y85b3zY/ZIrjDULji04+t98eJ705FNPQaUEweM9PrWMOHFoqallmlIii/6HKcsOb67Eulq/+dfHoqWtLP8zulviSAEADA3NxuEmk593EVuu/hNfzq5alH5Fk0xL+U3scU99HyaeDaZSk8/LaeW3cbJ73g7Nlpyk1zUfJUk1L4yIgjV6l+Yrlh+X7k3QxACAJibmw1CQS8/ua7TfmemdHVlQBA6xJK0nNLjzLJpstkUqt5fznmC0KGUPPWEcafwJaBCpcPRo2+Ny14oPoKhWH5tzK3pDUK//fabIAQAMKWbDULBxY3kIXLpF33G3hqXdO6LQag6TaCaXgaUc45b4w5ttI2izXa1WG3i1FGPJFGNM4XE1lS79PTu7NncA8qvTH9zuoPQb7/9JggBAEzsloNQeklo350+9s+jZ6ZVH5ZQ+HJR2Gk/9NCzR6FVp0mrGD9Peng5tQc5jLNdLZbLZXLNJhxTiD31u+OCxep9fHackGpptb/8AdPfguKOsw8/vx0JQgAAU7rZIJTfynb8HdFSKqk9Pjt43Fzw+OzgKzv7W8viJ103cak0TeFaTjbjIeWkj8+uhJOeiyX58+yiVFi7/NMZO2pPROj4QdXsG1FddS4FoRu/IFQNQrUUJAgBAFza7Qahvq+OnHo/2RzdQRR4bN1ByMMSAACmd8tBaFe9a2y7Kt6rdjvCu8zu4FkBD6/2HaFaChKEAAAu7caD0G63K33V/g5iQ/mmOm6Tx2cDAMzNPQQhmDlBCABgbgQhuDhBCABgbgQhuDhBCABgbgQhuDhBCABgbgQhuLjhO05DEAIAuChBCC5OEAIAmBtBCC5OEAIAmJuLB6HtKvi90+1qsdy8Nb8Qmvwb6njpogZXKVqujtIyq+3hhcrbw/d0zWFQBXbZrywFSxXMqdLGbTXLFR5ah+K8qo0Tv1aYwdtm2Y7+eDsEE4Rjq3Xob7eMIAQAMDeXvyIUdlTvKAiNCAFBAcdCa0EomOTQda/PY2AFKpMdlqadba06XUFoYB2GzCtY8nC58xVxCDRRuv5AO8TFFts+Wg+D2i0jCAEAzM0Et8YFPdBjL/IwKvk3lL60XS2Wm23zoX7QN44/6Y/6z5tVO3a7iqeI39mUl1Wp7fgWqhQmvLhrnvePo5Hb1WKx2jTzDy+EhG8Met1NZaNueH8Fyv3/roDZtNS+AYMglFd4SB2GhNm8cY7/hFd/Dm2wXK2W4UJ9oB2C9liuVm09kxXRLMKpwVwQAgCYmym+I9T2Qd82y0PfeHXoVob/htKX9r3ztlNbvLSyXS2CznfYhz/+3XZkoy5tNHpolZKE1x2Ekh50tDjVKz/tm8qpYkAF3jbL5bKe9zpmGVeyWuH+OlTnVWuc6hWht82mWYtJXjyxHZoZLjdvwayyvHMsqH9ZygQhAIC5meRhCdvVh29vG3DJZZfkhWLnOOjRRiWkfeuBlSpfQcirV7jUk1zTyOceLEN9efsqEN1rd+jxHzv67QW22iWp6q1x0aWW7jpU59W59IULeHHLRONPbYdCo1SvCC1W2wHLUjFkx/nPf/7zn//8p/lXEAIAuKhJglDU7zxNd9LIHjCQXjgJ/z72aDOj69guV3f18huqkisLlW/ChLeEFSs3tAK75IXkCzFJaInrld4hmNaorw61eXU2TrbC0sWOx53aDtFb020mfXRDR7v1EoQAAOZmmsdnfzwJdX3Sv8hvlBsShM7wEIZmuTr734WZdQaht81y0ZOTxlUgmr64+JXxQ4JQXx1q86ouW29ILFy+O7Edog2z/tS41ban3Xq5NQ4AYG4m+h2hDyehYd8/GRyEhn+W3+24XJ3978IXS7ruNCtcmqrXtqcChUtnx8mLHfoTbo0bUoeO8JA3zilB6MR2KF4YLDR0M8PuZanr2HGaC0GuCAEATGmqH1T9aBIa0ME9PlMse7pXKQgll12K8WOIw3JlT1vuuSwRPXugnXn10k90K1d6Z1lXBWqpIxsfTB/Wq/iwhLS1xtZhQON0rplS/DixHZJSw2f0FS8VdS1LB0EIAGBupgpCzTPXOtUfylXtPgdfD1pty/djFYPQLnp8dj0F1auULFdTkf236bt73dvoaeDZI7ILFyja1/JrId0VCFoou5pRugry1lYrenx2ocKD61CbV615a3VuS8s2ppPbISw1e7BfYfLqsnRwaxwAwNxMFoSGKTy1Gm5eccdJLgS5IgQAMKV5BSE5iLskCAEAzM28ghDcJbfGAQDMjSAEFycIAQDMzQWD0P/8z//8C/z7b3HHGfLGc+zjAAAUXCoISUHQEIQAAObmUkEIaNhxAADmRhCCi7PjAADMjSAEF2fHAQCYG0EILs6OAwAwN4IQXJwdBwBgbgQhuDg7DgDA3AhCcHF2HACAuRGE4OLsOAAAcyMIwcXZcQAA5kYQgouz4wAAzI0gBBdnxwEAmBtBCC7OjgMAMDeCEFycHQcAYG4EIbg4Ow4AwNwIQnBxdhwAgLkRhODi7DgAAHNzhiBkMBhOGC60SwMAMIQgZDBcZ7jQLg0AwBCCkMFwneFCuzQAAEMIQgbDdYYL7dIAAAwhCBkM1xn+HwAA1yMIGQzXGUbtegAAnJcgZDBcZ7jQLg0AwBDjghAAAMAdEIQAAICHIwgBAAAPRxACAAAejiAEAAA8HEEIAAB4OIIQAADwcAQhAADg4QhCAADAwxGEAACAhyMIAQAAD0cQAgAAHo4gBAAAPBxBCAAAeDiCEAAA8HAEIQAA4OEIQgAAwMMRhAAAgIcjCAEAAA9HEAIAAB6OIAQAADwcQQgAAHg4glDux9enp6enp8/f/9n9+Pr09cfun++f9/8G/vn++enrj+RtyTT3J1/q+LVu4Tv3U3/+/s+htSO1dtyvDgAA+LALB6H3l+e2e/v88l6b7nXdTrZ+Lb2/9Ob3l+do6rigjtmVtB3yoBse9Lz/+f45eKWYgwZ10veLlFQ7rnn4cjQ6b6D9BNGitq1SeO/+3dFqqZZc9OPrU2U5//n+OQwwSS48NlgTl44vZu3WFSjrcwcAgDEuGIRe10nXOuuyl8a/vzwf3xX8WXjvoTOfzKCd5nU9qGOfirvzSee+GRnFh6h/33dR43X99PT8/JwsTFzZdMGjxUhbYp92gjFxEOppgveXtCqJ0gWbxGFRhwWh7MXOIDRg7oIRAAAnuFgQOoaS5qrE88t78RpO1l0/vjPpowcp55CBntfr5yQ+jLwK1Oq/r6vt9Uc9/h9fn77+SK8PFfNTsLBpVaMEF7dJHmZK7fKybic6exAaeMPfoFvj8hDZeWuce+EAALiMCwWh95fnYww6dLODYNTdN2+65kk6CDLU+8vLazJqV0gTJ8mva2Q98TQIff78OQkL1SBUCXnhJaD8HYUgFIzZF3ls8N2Fg1AU+bK7BYdeEfrxtX7JLJ371x9dF4bEJAAATnKhIHSIO6XU052E2kiQdtELXfYoEuxff22//XLCfXG7riDUvJJfEdolialyGSVYhCz61L7cNOTWuGO2WifxsPQdoaRVhgWhH23iCQJNnINGBKFjrilcIUquCUWt+s8/4Te0BkYpAAAomVUQitLBKUEojAgnfkcovPgQ3Ab3z/fPT2EAKFyVCHJB+Y6ueAlq9Tuml+A7QrGkEaKLbscnIZz1itDhmky7bIeFK0Sdboc2+fH18+fPT5+/fo3uJyxeRQsb8sf3z8cZiEAAAHzQ5W+Na25nS8dk78ivhVRujSuOyrr0lTdUro0EASjqZjfjgysTpStC0SvFIFS6PlPLIO3C9IaZ+LtT+7vkzh+E4iR0XMi0pcKFrl0R+uf758/fv389PJ28emdd+6av3Q9MEIoAADjBDB6WsKs8T674XZiOKdIJKvPqkfbHf3wNQtC+c18PQruOkXkqaZa6EFiaUWOC0D5mvpwzCLXL2gSb/ZWvH/F9ccWGKwWhfdO0L5avI7UX2bKcE10k8jRtAABOM4PHZ1f74t2Pz95lUSfLRR98fPb+YlDwKIRDZ743CJV+drRUnWbJ08thwZKPC0LH4HmuIJR8s2fM7yiVg9A/37+WribtiqGn+POt7XzEIAAATnb9H1Qt/rhn+EWh+pvzaz5hYR95WMI/3z/HD3EOvyhT+Y5QK+/mV/JGGvUKTVUOM0H6KV0I6/pB1bi07iBUfXZ2FlGKwWjQ7wgFEySjynP3RG0AAM7gwkHohjTxptj1P3xVqP2WS3ZFKIpHd9FVP2aX3qcgfP1RuJyTp8agUYLvGVV8/v49+85R85JvBQEA8EGCEAAA8HAEIQAA4OEIQgAAwMMRhAAAgIcjCAEAAA9HEAIAAB6OIAQAADwcQQgAAHg4ghAAAPBwBCEAAODhCEIAAMDDEYQAAICHIwgBAAAPRxACAAAejiAEAAA8HEEIAAB4OIIQAADwcAQhAADg4QhCAADAwxGEAACAhyMIAQAAD0cQAgAAHo4gBAAAPBxBCAAAeDiCEAAA8HAEIQAA4OEIQgAAwMMRhAAAgIcjCAEAAA9HEAIAAB6OIAQAADwcQQgAAHg4ghAAAPBwBCEAAODhCEIAAMDDEYQAAICHIwgBAAAPRxACAAAejiAEAAA8HEEIAAB4OIIQAADwcAQhAADg4QhCAADAwxGEAACAhyMIAQAAD0cQAgAAHo4gBAAAPBxBCAAAeDiCEAAA8HAEIQAA4OEIQgAAwMMRhAAAgIcjCAEAAA9HEAIAAB6OIAQAADyc/w+vFEnuPlxmowAAAABJRU5ErkJggg==" alt="" />
6 实现 代码如下
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens;
using System.Linq;
using System.Net;
using System.Threading;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; using System.Net.Http;
using Newtonsoft.Json;
using System.Net.Http.Headers; public partial class _Default : Page
{ // // Add-AdfsClient -ClientId "aa106265-fb3b-49e0-a0e8-6840b3d71ac2" -Name "hongfu dynamics CRM ADFS Client" -RedirectUri "http://localhost:21313/Default.aspx" private static AuthenticationContext _authenticationContext; // TODO Set these string values as approppriate for your app registration and organization.
// For more information, see the SDK topic "Walkthrough: Register an app with Active Directory".
private const string _clientID = "aa106265-fb3b-49e0-a0e8-6840b3d71ac2";
public const string CrmServiceUrl = "https://crm.crmad.com:446/";
public const string _adfs = "https://adfs.crmad.com/";
public const string _returnURL = "http://localhost:21313/Default.aspx"; protected void Page_Load(object sender2, EventArgs e)
{
System.Net.ServicePointManager.ServerCertificateValidationCallback =
((sender, certificate, chain, sslPolicyErrors) => true); if (!string.IsNullOrEmpty(Request["code"]))
{ GetToken(Request["code"]);
//3. Client request access token }
} //<snippetModernOdataAppAuthDiscovery>
/// <summary>
/// Discover the authentication authority.
/// </summary>
/// <param name="serviceUrl">The URL of the organization's SOAP endpoint. </param>
/// <returns>The authority URL.</returns>
/// <remarks>The service URL must contain the SdkClient property.</remarks>
/// <example>https://contoso.crm.dynamics.com/XRMServices/2011/Organization.svc/web?SdkClientVersion=6.1.0.533;</example>
public static string DiscoveryAuthority(Uri serviceUrl)
{
// Use AuthenticationParameters to send a request to the organization's endpoint and
// receive tenant information in the 401 challenge. HttpWebResponse response = null;
try
{
// Create a web request where the authorization header contains the word "Bearer".
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(serviceUrl); // The response is to be encoded.
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
response = (HttpWebResponse)httpWebRequest.GetResponse();
} catch (WebException ex)
{
response = (HttpWebResponse)ex.Response; }
finally
{
if (response != null)
response.Dispose();
}
// Return the authority URL.
return response.ToString();
}
//</snippetModernOdataAppAuthDiscovery> protected void Button1_Click(object sender, EventArgs e)
{
string url = string.Format("{0}adfs/oauth2/authorize?response_type=code&client_id={1}&resource={2}&redirect_uri={3}"
, _adfs, _clientID, Server.UrlEncode(CrmServiceUrl), Server.UrlEncode(_returnURL)); Response.Redirect(url); } public class CRMToken
{
public string access_token { get; set; }
public string token_type { get; set; } public string expires_in { get; set; } public string refresh_token { get; set; }
} void GetToken(string code)
{ string url = string.Format("{0}adfs/oauth2/token"
, _adfs); string body = string.Format("grant_type=authorization_code&client_id={0}&redirect_uri={1}&code={2}"
, _clientID, Server.UrlEncode(_returnURL), code); var requestJson = JsonConvert.SerializeObject(new
{
grant_type = "authorization_code",
client_id = _clientID,
redirect_uri = Server.UrlEncode(_returnURL)
,
code = code
}); HttpClient client = new HttpClient();
HttpContent content = new StringContent(body);
content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
var tokenstr = client.PostAsync(url, content).Result.Content.ReadAsStringAsync().Result; var token = JsonConvert.DeserializeObject<CRMToken>(tokenstr); using (HttpClient httpClient = new HttpClient())
{
httpClient.Timeout = new TimeSpan(0, 2, 0); // 2 minutes
httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token.access_token); //GET [Organization URI]/api/data/v8.1/accounts?$select=name&$top=3 HTTP/1.1
// Accept: application / json
//OData - MaxVersion: 4.0
//OData - Version: 4.0 var api = string.Format("{0}api/data/v8.1/accounts?$select=name&$top=3", CrmServiceUrl); httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
var str = httpClient.GetStringAsync(api).Result; this.TextBox1.Text = str; }
using (HttpClient httpClient = new HttpClient())
{
httpClient.Timeout = new TimeSpan(0, 2, 0); // 2 minutes
httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token.access_token); //GET [Organization URI]/api/data/v8.1/accounts?$select=name&$top=3 HTTP/1.1
// Accept: application / json
//OData - MaxVersion: 4.0
//OData - Version: 4.0 var api = string.Format("{0}api/data/v8.1/WhoAmI()", CrmServiceUrl); httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
var str = httpClient.GetStringAsync(api).Result; this.Label1.Text = str; }
} protected void Button1_Click1(object sender, EventArgs e)
{
string url = string.Format("{0}adfs/oauth2/authorize?response_type=code&client_id={1}&resource={2}&redirect_uri={3}"
, _adfs, _clientID, Server.UrlEncode(CrmServiceUrl), Server.UrlEncode(_returnURL)); Response.Redirect(url);
}
}
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server"> <p>
<br />
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click1" Text="登录CRM" />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</p>
<p>
<asp:TextBox ID="TextBox1" runat="server" Height="183px" TextMode="MultiLine" Width="833px"></asp:TextBox>
</p> </asp:Content>
crm on premise IFD 部署下提供oauth 2.0 集成自定义应用的更多相关文章
- ASP.NET WebApi OWIN 实现 OAuth 2.0(自定义获取 Token)
相关文章:ASP.NET WebApi OWIN 实现 OAuth 2.0 之前的项目实现,Token 放在请求头的 Headers 里面,类似于这样: Accept: application/jso ...
- Dynamics CRM ADFS及IFD部署后延长系统注销时间
Dynamics CRM 部署IFD后,一段时间后登陆状态会失效,系统会提示让你重新登陆,可以通过延长失效时间来规避 在 powershell中执行如下指令 Set-ADFSRelyingPartyT ...
- OAuth 2.0协议在SAP产品中的应用
阮一峰老师曾经在他的博文理解OAuth 2.0里对这个概念有了深入浅出的阐述. http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 本文会结合我 ...
- OAuth 2.0 安全案例回顾
原文:http://drops.wooyun.org/papers/598 0x00 背景 纵观账号互通发展史,可以发现OAuth比起其它协议(如OpenID)更流行的原因是,业务双方不仅要求账号本身 ...
- OAuth 2.0安全案例回顾
转载自:http://www.360doc.com/content/14/0311/22/834950_359713295.shtml 0x00 背景 纵观账号互通发展史,可以发现OAuth比起其它协 ...
- Dynamics Crm 2011 Or 2013 IFD 部署一段时间后,CA验证问题
以下错误描述摘自博客:http://blog.csdn.net/qzw4549689/article/details/14451257 IFD部署一段时间后,大概一年,突然出现从IFD登录页面登录后, ...
- CRM IFD 部署在同一台服务器上遇到的错误
为了学习Dynamics 365,在阿里去上部署一台Dynamics 365服务器.然后实现了IFD 部署.学习的路线还之前的CRM 版本大致一样,这里只是记录一下我遇到的问题及解决问题的思路. 学习 ...
- Dynamics CRM 配置 OAuth 2.0
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复124或者20140324可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 本博文主要参考但不限于如下资料: ...
- Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx)
Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx) 一丶集群和Nginx反向代理 ...
随机推荐
- ClickOnce部署(4):下载多个安装包
有时候,我们可能会一次性发布多个安装包,当然在网页上多加几个链接让用户逐个安装也是可取的.不过,也可以弄得更方便些,即用户先安装一个,作为一个"引导程序",然后通过这个程序去下载安 ...
- Npoi导出Excel 实战篇(Webform)
开篇语 废话不多说,直接上遇到的问题 需求:在这个界面点击导出,导出页面数据,苦于没有做过webfrom项目,弄了半天还是没想到原生态的好方法,所以在网上看了下有没有导出的好例子,结果发现有人推荐使用 ...
- 记住密码超简单实现(C#)
实现效果如下 实现过程 [Serializable] class User { //记住密码 private string loginID; public string LoginID { get { ...
- HTTP协议基础
一.介绍 Hyper Text Transfer Protocol(超文本传输协议)主要用于从WWW服务器传输超文本到本地浏览器的传送协议.已发展到1.1版本. 二.HTTP在TCP/IP参考模型的位 ...
- 感恩回馈,新鲜出炉的《ASP.NET MVC 5框架揭秘》免费赠送
上次针对<ASP.NET Web API 2框架揭秘>举办了一次评论赠书活动,很多人问我相同的活动要不要针对<ASP.NET MVC 5框架揭秘>(阅读样章)再来一次,为此我向 ...
- 数据可视化-EChart2.0使用总结2
接上一篇博客,这篇博客主要讨论EChart里面的散点图.气泡图和雷达图. 4.散点图-Scatter Chart 适合场景:三维数据集,但是只有两个维度需要比较.比较的是X轴和Y轴的数据,第三个数 ...
- Web Fundamentsals学习1-Multiple-Screen-Site
你的一个运行于多设备网站(Your First Multi-device Site) 遵循的步骤: 1.定义信息架构(information architecture)和页面结构(structure ...
- 使用karma测试平时写的小demo(arguments为例)
有人说前端自动化测试非常困难,我觉得确实如此.在项目中,我个人也不放心写的测试,还是要手动测试.但是我们平时写demo学习时,完全可以使用自动化测试. 传统demo 1,新建一个html 2,写入js ...
- 小菜学习Winform(一)贪吃蛇
前言 说到贪吃蛇,大家可能小时候都玩过,小菜最近在整理Winfrom的学习系列,那我觉得有兴趣才会有学习,就从这个小游戏讲起吧. 实现 其实我刚开始学习编程的时候,感觉写个贪吃蛇的程序会很难,因为涉及 ...
- 使用Spire组件抛出异常The type initializer for 'spr857' threw an exception
使用Spire组件抛出异常The type initializer for 'spr857' threw an exception 我使用免费的Spire.Xls组件尝试去转换Excel文档到PDF文 ...