联合验证Azure上(Federated Authentication on Azure)

2019-07-17 18:01发布

我使用WIF(.NET 4.5),和Azure的身份验证Active Directory中。 该网站将坐在天青。

一切都按本地预期,但是当我把它放到我蔚蓝得到错误:

数据保护操作不成功。 这可能是由没有加载当前线程的用户上下文的用户配置文件,当线程模拟其可能是这种情况造成的。

我理解,这是因为应用程序不能使用DAPI,所以我需要切换到保护我的应用程序与MAC。

我在本地已将此添加到我的webconfig: -

 <securityTokenHandlers>
    <remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </securityTokenHandlers>

如在推荐的文件 ,我添加静态机键,但我不能找到密钥长度周围任何意见-所以我假定256。

这种配置不过才给出了这样的错误:

[CryptographicException:加密操作过程中发生错误。] System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.HomogenizeErrors(Func`2 FUNC,字节[]输入)115 System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.Unprotect(字节[] protectedData)59 System.Web.Security.MachineKey.Unprotect(ICryptoServiceProvider cryptoServiceProvider,字节[] protectedData,字符串[]目的)62 System.Web.Security.MachineKey.Unprotect(字节[] protectedData,字符串[]目的)+ 122 System.IdentityModel.Services.MachineKeyTransform.Decode(字节[]编码)161个System.IdentityModel.Tokens.SessionSecurityTokenHandler.ApplyTransforms(字节[]饼干,布尔出站)123 System.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(的XmlReader读取器,SecurityTokenResolver tokenResolver)575 System.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(字节[]令牌,SecurityTokenResolver tokenResolver)76 System.IdentityModel.Services.SessionAuthenticationMod ule.ReadSessionTokenFromCookie(字节[] sessionCookie)833 System.IdentityModel.Services.SessionAuthenticationModule.TryReadSessionTokenFromCookie(SessionSecurityToken&sessionToken)186 System.IdentityModel.Services.SessionAuthenticationModule.OnAuthenticateRequest(对象发件人,EventArgs EventArgs的)210 System.Web.SyncEventExecutionStep。 System.Web.HttpApplication.IExecutionStep.Execute()136 System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔逻辑completedSynchronously)69

我删除了的machineKey部分柜面我没有指定一个格式正确的钥匙,但这个错误不会消失。

什么打架WIF已!

Answer 1:

如果你没有在配置中指定的machineKey,天青加1。 但是,如果你创建应用程序的新版本,并使用VIP开关将其部署到Azure中,天青生成用于分期部署一台新机器密钥(假设你的第一次部署是生产)。 (VIP开关是用于部署新的版本,然后将生产和舞台之间的虚拟IP地址好的机制)。

所以基本上一个解决方案是让Azure中生成密钥,但VIP切换后,你有问题了。 为了避免它,你可以赶上的Application_Error处理程序中,这样的事情在Global.asax中CryptographicException:

// Be sure to reference System.IdentityModel.Services
// and include using System.IdentityModel.Services; 
// at the start of your class
protected void Application_Error(object sender, EventArgs e)
{
    var error = Server.GetLastError();
    var cryptoEx = error as CryptographicException;
    if (cryptoEx != null)
    {
        FederatedAuthentication.WSFederationAuthenticationModule.SignOut();
        Server.ClearError();
    }
}

所述SignOut()方法会导致cookie被除去。

编辑 :作为由@anjdreas指出生成的machineKey更新的信息。

另一种解决方案是生成的machineKey,您可以使用IIS管理器来做到这一点,请参阅生成的machineKey最简单的方式了解详情。 如果把同样的钥匙插入Azure的Web角色中的所有网页appliactions,Azure的部署过程不会取代它。



Answer 2:

本机键不应该存在:Windows Azure中生成一个给你,并确保它是在你的角色每一个实例相同。

关于你看到的错误:你可以尝试清除cookies吗?



Answer 3:

只需清除cookies在这种情况下,解决问题的全部给我。



Answer 4:

如果您使用窗体身份验证。 当你捕获异常,并允许用户登录并创建一个有效的cookie,你可以signout

catch (CryptographicException cex)
{
    FormsAuthentication.SignOut();
}


Answer 5:

要求所有用户以清除所有的cookies是不是真的我的选择。 在这个网站 ,并在书中“编程Windows身份联盟”我发现了一个更好的解决方案(对我来说,反正)。 如果您已经上传SSL证书Azure中,你可以使用该证书对所有Azure的情况下,也加密您的cookie,你不需要担心新机键,IIS用户配置文件,等等。



文章来源: Federated Authentication on Azure