默认 REST Host 是 SDK 中提供的最强大的 Host。此Host不仅允许访问 REST,还可以处理 OAuth 身份验证、本地用户解析、用户同步和单一登录。此 Host 类型只能在 Web 项目中使用。
生命周期
默认 REST Host 是自初始化的,这意味着它们在您首次请求时,从您提供的配置数据中加载自身。从那时开始,Host 在整个应用程序进程期间都保留在内存中。强制创建 Host 并使用 Host 本身的静态 GET 方法,根据名称从内存中检索 Host:
var restHost = Limyee.Extensibility.Rest.Version1.Host.Get("default");
设置
您需要在平台中创建一个私有的 OAuth 客户端,该客户端选中"信任客户端的授权代码"和"客户端凭据"的授权类型。对于回调 Url,它是应用程序中 oauth.ashx 文件的路径,默认情况下,该文件是在根目录(此文件由 SDK 安装)。例如,http://mysdksite.com/oauth.ashx mySDKSite.com 是第三方网站,而不是您的平台。
默认 REST Host 由 limyee_SDK.config 文件配置驱动。它包含名为"default"的 Host 的单个条目。如果您愿意,可以更改此名称,但要注意新名称,因为它稍后用于加载 Host。在所有示例中,我们将使用默认值。
下面是一个配置示例:
<limyeeHosts> <host name="default" limyeeUrl="http://mylimyeesite.com/"> <oauth clientId="[Oauth Client Id]" clientSecret="[OAuth Secret]" callbackUrl="~/oauth.ashx" cookieName="sdkUser" defaultLanguage="en-US" anonymousUsername="Anonymous"> <localAuthentication enabled ="true" membershipAdministrationUsername="admin" /> <sso enabled="true" synchronizationCookieName="LimyeeSdkSync" /> </oauth> <remoteProxy enabled="false" callbackUrl="~/proxy.ashx" /> </host> </limyeeHosts>
Host 节点
<host name="default" limyeeUrl="http://mylimyeesite.com/">
这是用于定义Host的主节点,所有其他配置选项都是此节点的子元素。此节点除了包含其他配置选项外,还标识 2 条信息:
- name:标识 Host 的名称,并将用于在代码中引用此 Host。如果有多个Host,则名称必须是唯一的。
- limyeeUrl:平台站点的完全限定域名
oauth 节点
这是另一个必需的节点,因为它标识了如何向平台进行身份验证。它是 Host 节点的直接后代。它使用基于授权代码的身份验证、OAuth 和客户端凭据的组合。
<host name="default" limyeeUrl="http://mylimyesite.com/"> <oauth clientId="[Oauth Client Id]" clientSecret="[OAuth Secret]" callbackUrl="~/oauth.ashx" cookieName="sdkUser" defaultLanguage="en-US" anonymousUsername="Anonymous"> </oauth> <remoteProxy enabled="false" callbackUrl="~/proxy.ashx" /> </host>
除了子配置对象之外,oauth 节点还需要以下信息:
- clientId:您之前设置的平台 OAuth 客户端 ID
- clientSecret:您之前设置的平台 OAuth 客户端密钥
- callbackUrl:与 SDK 一起安装的 oauth.ashx 的相对应用程序路径。默认情况下,它位于根目录(~/oauth.ashx) 中。
- cookieName:这是 SDK 为跟踪用户而写入的 Cookie 的名称。这样可以防止 SDK 进行连续调用身份验证。
- defaultLanguage:匿名用户使用的语言。
- anonymousUsername:这是用户未被视为已通过身份验证时使用的帐户。它必须是现有用户帐户,建议使用默认的匿名帐户。
使用平台用户进行身份验证
默认行为是启动 OAuth 流程,并允许用户使用平台账户登录到平台,然后为站点提供 SDK 使用的令牌。但是,在此过程中,您需要创建一个登录链接供用户使用。您可以使用此Host的方法执行此操作:
var restHost = Host.Get("default"); var loginUrl = restHost.LimyeeOAuthLoginUrl(returnUrl);
注销略有不同。在这里,您需要创建一个方法,可以通过触发回调或重定向到页面,来执行以下代码:
var restHost = Host.Get("default"); restHost.LimyeeOAuthLogout();
使用现有用户帐户
<oauth clientId="[Oauth Client Id]" clientSecret="[OAuth Secret]" callbackUrl="~/oauth.ashx" cookieName="sdkUser" defaultLanguage="en-US" anonymousUsername="Anonymous"> <localAuthentication enabled ="true" membershipAdministrationUsername="admin" /> </oauth>
如果要使用已定义的用户群,可以通过在 oauth 节点下添加 localAuthentication 节点,启用它并使用以下参数对其进行配置:
- enabled:打开或关闭节点,而无需将其删除。
- membershipAdministrationUsername:具有足够权限来管理平台中的用户。
您还需要连接 Host 对象以识别系统中的用户。您必须至少提供用户名和电子邮件地址,并且该地址在平台中必须是唯一的。如果您允许重复的用户名或电子邮件,则需要以某种方式解决此问题,因为平台不允许这样做。它的工作方式是 SDK 会询问您的应用程序谁已登录。使用您提供的信息,用户将找到自己的帐户或自动创建一个新帐户。SDK 请求此信息的方式是通过Host 的 ResolveLocalUser 函数。应在应用程序启动时定义此项。
var restHost = Limyee.Extensibility.Rest.Version1.Host.Get("default"); restHost.ResolveLocalUser = (host, resolveArgs) => { //This where you identify your logged in user return new Limyee.Extensibility.Rest.Version1.LocalUser("jdoe", "jdoe@somedomain.com"); };
单点登录
*要在您的网站和平台上使用单点登录,必须共享一个域。
如果要使用 SSO,请先登录到平台管理>集成>用户同步Cookie。
- 启用用户同步 Cookie。
- 设置网站和平台的域。如果您在 local.com 上有一个站点,但在 limyee.local.com 有一个平台,请将其设置为 .local.com。
- 如果需要,请更改 Cookie 名称。 记录此值供以后使用。
- 点击保存。
若要在站点上使用单一登录,请将 sso 节点添加到 limyee_SDK.config 文件中的 oauth 节点后代。
<oauth clientId="[Oauth Client Id]" clientSecret="[OAuth Secret]" callbackUrl="~/oauth.ashx" cookieName="sdkUser" defaultLanguage="en-US" anonymousUsername="Anonymous"> <localAuthentication enabled ="true" membershipAdministrationUsername="admin" /> <sso enabled="true" synchronizationCookieName="LimyeeSync" /> </oauth>
调整此节点上的属性:
- enabled:打开或关闭此功能。
- synchronizationCookieName:此值必须与您为平台设置的用户同步 Cookie 名称相匹配。
一旦你完成了这项工作,你可能需要对平台进行调整。由于这不是传统的 SSO 模块,因此您需要通过编辑小组件来调整平台中的登录和注销链接。他们现在需要指向您的自定义登录或注销屏幕。
它是如何运作的
首次从 Host 进行 REST 调用时,它将以静默方式调用 SSO 进程。它通过使用用户信息签署重定向 URL 并将其发送到平台来实现此目的,平台然后验证信息并登录用户。它写入同步 Cookie,以便平台在用户被重定向到平台时记住登录者。
如果要在首次登录时强制执行该过程,而不是等待第一次使用,则可以执行此操作。您将代码注入到身份验证代码中。最合适的位置是在对用户进行身份验证后重定向用户之前。
//This would be whatever returnUrl you would redirect to after authentication string returnUrl = "http://locahost"; //Your authentication code for your site //before redirecting var restHost = Host.Get("default"); var newReturnUrl = restHost.ProcessSynchronizedLogin(returnUrl); HttpContext.Current.Response.Redirect(newReturnUrl);
这将获取您的返回 URL,将其添加到已签名的平台 URL,然后重定向到强制登录的新平台 URL。完成后,平台会将您重定向到原始网址。
注销是一个相同的过程,但在注销代码中,您将使用:
//This would be whatever returnUrl you would redirect to after authentication string returnUrl = "http://locahost"; //Your logout code for your site //before redirecting var restHost = Host.Get("default"); var newReturnUrl = restHost.ProcessSynchronizedLogout(returnUrl); HttpContext.Current.Response.Redirect(newReturnUrl);
网址代理
所有 REST URL 都会将您所有限定的 URL 返回到您的平台。如果您不想重定向到平台,您可以告诉 SDK 返回代理。这意味着您过去获取平台 URL 的位置,现在您将收到指向本地 http 处理程序的 url。该处理程序将调用一个Host进程,您可以在其中决定要返回的 url。
将新的 ASHX 文件添加到您的网站,并将源文件设置为
<%@ WebHandler Language="C#" Class="Limyee.Extensibility.Rest.Version1.UrlProxy, Limyee.Rest.SDK" %>
您还可以使用同一类将处理程序注册为路由或其他方法。
作为Host节点的子节点,添加如下所示的远程代理节点:
<host name="default" limyeeUrl="http://mylimyeesite.com/"> <oauth clientId="[Oauth Client Id]" clientSecret="[OAuth Secret]" callbackUrl="~/oauth.ashx" cookieName="sdkUser" defaultLanguage="en-US" anonymousUsername="Anonymous"> <localAuthentication enabled ="true" membershipAdministrationUsername="admin" /> <sso enabled="true" synchronizationCookieName="LimyeeSync" /> </oauth> <remoteProxy enabled="true" callbackUrl="~/proxy.ashx" /> </host>
设置属性:
- enabled:打开或关闭此功能。
- callbackUrl:您刚刚创建的处理程序的相关应用程序 URL。
当应用程序启动时,您将需要添加处理 URL 的函数:
var restHost = Host.Get("default"); restHost.GetRedirectUrl = (host, url, urlArgs) => { // The url parameter is the you can use it to evaluate if you need to redirect it. // Return the Url you wish to redirect to return url; };
您将获得正在调用的 Host 实例、正在请求的平台 url 以及允许您访问当前 HttpContext 的对象等作为参数。
评估传入的 URL 以满足您的需求,如果您希望将其发送到另一个 Url,请返回新的目标 URL。假如,您不希望将其发送到其他网址,只需按原样返回发送的网址即可。如果要分析来自平台 URL 的上下文特定信息,可以使用函数对远程实体端点进行 REST 调用,并为其传入 Url。
多个 Host
如果需要,可以有多个 Host。例如,如果您有多个平台要使单个应用程序与之通信,或者您的应用程序支持多个站点并且每个站点都映射到一个 Host。则可能需要这样做。
另一个 Host 只要配置另一个 Host 节点:
<limyeeHosts> <host name="default" limyeeUrl="http://mylimyeesite.com/"> <oauth clientId="[Oauth Client Id]" clientSecret="[OAuth Secret]" callbackUrl="~/oauth.ashx" cookieName="sdkUser1" defaultLanguage="en-US" anonymousUsername="Anonymous"> <localAuthentication enabled ="true" membershipAdministrationUsername="admin" /> <sso enabled="true" synchronizationCookieName="LimyeeSync" /> </oauth> <remoteProxy enabled="false" callbackUrl="~/proxy.ashx" /> </host> <host name="SiteB" limyeeUrl="http://myanotherlimyeesite.com/"> <oauth clientId="[Oauth Client Id]" clientSecret="[OAuth Secret]" callbackUrl="~/oauth.ashx" cookieName="skdUser2" defaultLanguage="en-US" anonymousUsername="Anonymous"> <localAuthentication enabled ="true" membershipAdministrationUsername="admin" /> <sso enabled="true" synchronizationCookieName="LimyeeSync" /> </oauth> <remoteProxy enabled="false" callbackUrl="~/proxy.ashx" /> </host> </limyeeHosts>
您需要确保它是不同的主机名。此外,您还可以考虑使用不同的 Cookie 名称以避免冲突。您不需要使用多个 oauth.ashx 或 proxy.ashx,因为它们可以识别主机实例。
然后,您按名称获得新主机:
var restHost = Host.Get("SiteB");