C# 从另一个站点登录Umbraco

C# 从另一个站点登录Umbraco,c#,umbraco,C#,Umbraco,我刚刚开始使用Umbraco,我的想法是创建一个站点(在Umbraco下运行),其中包含另一个站点的文档。但要求是,除非您登录到主站点,否则您无法在文档站点上看到任何内容 所以在我的主站点上,当你登录时,你会得到一个.ASPXAUTHcookie。在Umbraco端,我需要做什么才能读取并检查它的有效性(真的,知道cookie中嵌入的数据,例如用户的身份现在实际上并不重要),如果无效(或不存在),它应该将您重定向到主站点登录(我不想在Umbraco中重新创建相同的登录过程). 正确的方法是什么

我刚刚开始使用Umbraco,我的想法是创建一个站点(在Umbraco下运行),其中包含另一个站点的文档。但要求是,除非您登录到主站点,否则您无法在文档站点上看到任何内容

所以在我的主站点上,当你登录时,你会得到一个
.ASPXAUTH
cookie。在Umbraco端,我需要做什么才能读取并检查它的有效性(真的,知道cookie中嵌入的数据,例如用户的身份现在实际上并不重要),如果无效(或不存在),它应该将您重定向到主站点登录(我不想在Umbraco中重新创建相同的登录过程).

正确的方法是什么?我看到了有关在Umbraco中创建
会员资格证明人的链接,但我不想重新创建整个内容。我只需要知道你有cookie,它是由主站点创建的合法cookie

我可以将两个站点放在同一个域上,所以我真正需要的是Umbraco端读取cookie并确认它是有效的,如果是真的,则只显示特定页面的内容。我可以创建自己的
成员资格提供者
,让我实现
ValidateUser
,但我需要更快地挂接该过程。我需要连接到Umbraco决定用户是否登录的位置

编辑:我可能在这方面取得了一些进展,但我还不太清楚。我创建了一个从
RenderMvcController
继承的控制器,并添加了一个自定义
AuthorizeAttribute

public class CustomUmbracoDefaultController : Umbraco.Web.Mvc.RenderMvcController
{
    [TestAuthorize]
    public override ActionResult Index(RenderModel model)
    {
        return base.Index(model);
    }
}

public class TestAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return base.AuthorizeCore(httpContext);
    }
}
我添加了一个启动处理程序来设置默认控制器类型:

public class StartupHandler : ApplicationEventHandler
{
    protected override void ApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
    {
        DefaultRenderMvcControllerResolver.Current.SetDefaultControllerType(typeof(Controller.CustomUmbracoDefaultController));
    }
}
然后在设置中:

<authentication mode="Forms">
  <forms loginUrl="http://localhost:6550/account/Login" protection="All" path="/" />
</authentication>

当我第一次进入时,
cookie
按预期为空,您将被踢到登录页面(在另一个端口)。登录后,我可以看到
.ASPXAUTH
cookie已设置(仍在端口
6550
)。然后,当我将Umbraco的端口放回时,当它点击
AuthorizeCore
时,
.ASPXAUTH
cookie仍然为空?因此,它将再次返回登录页面。如果我跳过空检查并仅返回true,我的Umbraco页面将加载并在浏览器中查看,我可以看到
。ASPXAUTH
cookie就在那里。那么为什么我不能在
AuthorizeCore
中看到它呢

好的,我解决了缺少的ASPXAUTH cookie部分。我必须匹配原始项目和Umbraco项目中的
machineKey
条目。我想如果它不能解码cookie,它就会被忽略


那么,现在是否存在一个cookie,它能够用我的机器密钥解码,足以确认用户已登录?对于Umbraco方面,我完全不在乎谁登录,只在乎他们是否登录。

你将无法跨站点共享Cookie,除非它们可能存在于同一个域中。@DavidG:是的,我知道他们需要在同一个域中共享Cookie。或者我需要一些其他方式在他们之间进行通信。但是,如果您希望跨站点、甚至跨域进行单次登录,您可能需要使用Identity Server之类的工具。您可以通过WebAPI公开您的Umbraco数据,并从您的站点进行查询。这样,您就可以在站点上保持成员身份验证,并创建一个连接到Umbraco API的服务。要保护Umbraco API,您只需在两个站点(令牌或用户和密码)之间创建一个内部登录过程。@MarioLopez:API可能可用,但我需要能够让它吐出呈现的页面,然后在我的站点上显示给用户。
UmbracoCms.RestApi
软件包似乎没有做到这一点。
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    var cookie = httpContext.Request.Cookies[".ASPXAUTH"];
    if (cookie == null)
    {
        return base.AuthorizeCore(httpContext);
    }
    return true;
}