crm on premise IFD 部署下提供oauth 2.0 集成自定义应用

很多情况下我们的CRM系统会和弟三方应用集成,一般情况我们会开发一个中间站点来提供web api 给弟三方应用。

利用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参数

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 ,查询出当前用户和客户信息

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>
时间: 2024-10-24 00:31:56

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/json Content-Type: application/json Authorization: Bearer pADKsjwMv927u... 虽然这是最标准的实现方式,但有时候我们会面对一些业务变化,比如 Token 要求放在 URL 或是 Post Body 里面,比如这样: https://w

OAuth 2.0协议在SAP产品中的应用

阮一峰老师曾经在他的博文理解OAuth 2.0里对这个概念有了深入浅出的阐述. http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 本文会结合我在SAP做过的项目,来给大家介绍这个协议是如何应用到SAP产品中去的. 我做过的最早的一个和OAuth 2.0相关的项目,是2013年时作为SAP成都研究院CRM开发团队的一员,参与设计和开发了SAP CRM和社交媒体集成解决方案.该方案实现了Twitter, Facebook和新浪微博等社交媒体和

OAuth 2.0安全案例回顾

转载自:http://www.360doc.com/content/14/0311/22/834950_359713295.shtml 0x00 背景 纵观账号互通发展史,可以发现OAuth比起其它协议(如OpenID)更流行的原因是,业务双方不仅要求账号本身的认证互通(authentication:可理解为“我在双方的地盘姓甚名谁”),而是更需要双方业务流的授权打通(authorization:可理解为“我在双方的地盘上可做什么”),因为后者才能产生实际的互惠互利. 2013年将过大半,有关O

Dynamics CRM IFD部署后延长系统注销时间

Dynamics CRM 部署IFD后,一段时间后登陆状态会失效,系统会提示让你重新登陆,可以通过延长失效时间来规避 <span style="font-size:18px;">Set-ADFSRelyingPartyTrust -Targetname "CRM IFD Relying Party" -TokenLifetime 480</span> "CRM IFD Relaying Party"  是你的ADFS管理器

CRM 2013 配置 OAuth 2.0

目前本博文是基于Windows Server 2012 R2,它自带的 AD FS 的版本是 2.2,其他版本不支持. 首先要在AD FS服务器上为Intranet打开基于表单的验证,这里我的 前一篇博文 已经讲了. 1. 以管理员身份登陆到AD FS服务器. 2. 打开 AD FS管理界面. 3.点击左边的 身份验证策略,会看到中间的 主要身份验证 部分的 全局设置,点击  编辑 链接. 4.将Intranet下面的 表单身份验证 勾选. 处理后界面如下. 然后就是在AD FS服务器上打开Po

Web API在OWIN下实现OAuth

Web API在OWIN下实现OAuth OAuth(Open Authorization) 为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAuth是安全的. 本节目录: Owin下WebAPI SelfHost 创建AccessToken 使用AccessToken Owin下WebAPI SelfHost 1.创建一个控

CentOS7.3下利用cobbler2.8.0部署exsi5.5

前言:昨天提到了如何在CentOS7下利用cobbler来部署CentOS,没接触过的朋友可以参考我上一篇的文章:http://molewan.blog.51cto.com/287340/1908475,今天又测试了下利用cobbler2.8.0部署esxi5.5,参考了网上的一些资料,但与我实际操作中碰到的有些差异,所以特意记录下来. 1.查看cobbler的版本 [[email protected] ~]# cobbler --version Cobbler 2.8.0   source: 

理解OAuth 2.0

作者: 阮一峰 链接:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749. 一.应用场景 为了理解OAuth的适用场合,让我举一个假设的例子. 有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来.用户

理解OAuth 2.0(转)

转自:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 理解OAuth 2.0 作者: 阮一峰 日期: 2014年5月12日 OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749. 一.应用场景 为了理解OAuth的适用场合,让我举一个假设的例子. 有一个"云冲印"的网