【问题标题】:Sharing authentication between parent and child web applications在父子 Web 应用程序之间共享身份验证
【发布时间】:2013-06-03 09:43:38
【问题描述】:

我们有两个独立的 MVC 4 Web 应用程序,它们作为同一网站的一部分运行。主(父)项目具有身份验证,并且工作正常。现在我们已经将第二个项目添加到同一个站点(一个在子框架中运行的页面),我们无法弄清楚如何使它使用用户通过父应用程序获得的授权。

两者都在 web.config 中使用相同的表单元素:

<forms loginUrl="~/Account/LogOn" name=".ASPXFORMSAUTH"  domain="..." protection="All" timeout="2880"/>

在子项目中我需要的不仅仅是 [Authorize] 标记吗?

[Authorize]
public class HomeController : Controller
{
    ...

    public ActionResult Index()
    {

        return View();
    }

    ...
}

不用说,如果我尝试访问子项目的 HomeController,即使用户在父项目中登录,页面也会被重定向到登录页面。

两个项目使用相同的 machineKey。

有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc-4 forms-authentication


    【解决方案1】:

    确保域属性设置为父域:

    <forms 
        loginUrl="~/Account/LogOn" 
        name=".ASPXFORMSAUTH"  
        domain="domain.com" 
        protection="All" 
        timeout="2880"
    />
    

    还要确保您为两个应用程序设置了相同的机器密钥:

    <machineKey validationKey="5C1E392DB9867A990FE0161B8BD07C1B165921DDAB21ADCC4C8F15D67EA2DECD7AEBB04409A411C69CB125EDEA3702B64DF17D47AD951461F444175BDF0277CF" decryptionKey="43CC900E97D496FC6C5C0C12FE005F9E846675C4BD45977BA5CEE852741ED3B6" validation="SHA1" decryption="AES" />
    

    这将确保由第一个应用程序加密的表单身份验证 cookie 可以被第二个应用程序解密。您可以使用以下网站生成强机器密钥。

    (链接已删除。不再有效)

    【讨论】:

    • 它们确实使用相同的域字符串,并且它们也具有相同的 machineKey 元素。但是,域字符串类似于“domain.com”,而访问站点的 URL 类似于“sub1.sub2.domain.com”。只要字符串在父子 web.configs 中匹配,这会有所不同吗?
    • 不,如果您的网站托管在 sub1.domain.comsub2.domain.com 上,您应该将域属性设置为 domain="domain.com"。如果您不使用任何 ASP.NET 会话,这应该可以工作。这只是共享表单身份验证 cookie,而不是会话。如果您依赖某个会话,它将无法工作,因为会话默认存储在应用程序的内存中。例如,如果您希望能够在应用程序之间共享会话,则必须使用共享会话提供程序,例如 SQL Server。
    • 是的。我们只是共享表单身份验证 cookie。所以这应该有效。然而,事实并非如此。我可以看到cookie是在Chrome中创建的,但不知道为什么子项目无法解密。
    • 执行请求时是否验证过cookie是否发送到子域?
    • 感谢您对达林的支持。原来是其他项目设置cookie出错。
    猜你喜欢
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 2019-03-23
    • 2011-03-27
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    相关资源
    最近更新 更多