Windows Azure 中 Silverlight 应用程序的表单身份验证



我正在将n层Silverlight应用程序迁移到Windows Azure,我遇到了障碍。登录后,Web 服务无法知道谁经过身份验证。我的云项目有两个角色:

  • Web UI:在Azure上,其IP为111.222.33.44:80
  • Web 服务:在 Azure 上,其 IP 为 111.222.33.44:8080

网页用户界面的配置:

<system.web>
    <compilation debug="true" targetFramework="4.0" />
    <authentication mode="Forms">
        <forms name="COOKIENAME" loginUrl="~/Login/login.aspx" timeout="2880" />
    </authentication>
    <authorization>
        <deny users="?" />
    </authorization>
    <machineKey validation="SHA1" decryption="AES" validationKey="VKEY" decryptionKey="DKEY"></machineKey>
    <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" />
</system.web>

Web 服务的配置

<system.web>
    <authentication mode="Forms">
        <forms name="COOKIENAME" loginUrl="~/Login/login.aspx" timeout="2880" />
    </authentication>
    <authorization>
    <deny users="?" />
    </authorization>
    <machineKey validation="SHA1" decryption="AES" validationKey="VKEY" decryptionKey="DKEY"></machineKey>
</system.web>

在 Web UI 角色中,登录名/登录名.aspx提交用户名和密码。使用 FormsAuthentication.SetAuthCookie(username, myVar); 方法创建 cookie 。然后,用户被重定向到包含 Silverlight 应用程序的Default.aspx

启动时,Silverlight 应用程序通过返回 HttpContext.Current.User.Identity.Name 从 Web 服务角色获取用户名。

在本地云模拟器中一切正常,但是当我在Windows Azure(暂存)中部署我的项目时,Web服务不知道我已连接。我使用了Fiddler,我看到页面111.222.33.44:8080/Login/login.aspx正在查询(该页面在Web服务角色中不存在,这是一种知道用户是否经过身份验证的方法)。

我怀疑 Web 服务无法检索用户名,因为它无法检索由 Web UI 角色创建的 Cookie。是否实际上可以使其工作,或者我是否必须将 Web 服务角色与 Web UI 角色合并?

两个角色上的计算机密钥相同。

AFAIK 这两个角色不会共享 cookie。

在类似的情况下,我有一个承载 silverlight 客户端的 Web 项目,以及一个由 silverlight 应用程序使用的 Web 服务。

用户将登录网站并访问 silveright 客户端。已使用 param 属性向客户端提供了 Web 服务身份验证令牌

<object data="data:application/x-silverlight-2," type="application/x-silverlight-2">                
   <param name="Token" value="<%=Token %>" />

令牌一旦被 Web 服务解密,就包含登录用户的 ID。

现在,Silverlight 客户端可以访问无状态 Web 服务,并且 Web 服务知道请求与哪个登录用户相关。

我将 Web 服务和 WebRole 分开,以便服务可以处理 CPU 密集型作业,让 Web 角色可以很好地快速提供网页。

这有帮助吗?

最新更新