14

VS2010 では、私の MSTest テストは問題なく実行されました。

VS2012 で実行すると、エラーが発生します。このテストでは、カスタム ビジネス プリンシパルを使用して Csla.ApplicationContext.User を設定します。EntityFramework が新しい ObjectContext を提供するように求められると、カスタム ビジネス プリンシパル タイプが見つからないという SerializationException を受け取ります。

VS2012 のテスト ランナーまたは Resharper7 のテスト ランナーを介して実行すると、EntityFramework を使用するすべてのテストが失敗します。NCrunch のテスト ランナーを試してみましたが、すべて成功しました。

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

3

私は私の本当の問題を見つけました。VS2012は別のAppDomainでテストを実行し、データアクセス層はReflectionを介してロードされます。EFがプリンシパルの知識を必要とする理由はまだわかりませんが、私たちの解決策は、EFにアクセスする前にプリンシパルをGenericPrincipalにリセットしてから、元のプリンシパルを元に戻すことでした。私はまだIoCコンテナがこの問題を軽減するだろうという考えに取り組んでいます

于 2012-11-09T13:47:24.917 に答える
0

また、.net 4.5 クレーム プリンシパル アプローチにも注意する必要があります。VS2012でEF5.0を使用して.net4.5ターゲット.net4.5をターゲットにして、との違いをテストし WindowsIdentity.GetCurrent().Name;
ます Thread.CurrentPrincipal

FORMS 認証の下で、このような小さなルーチンを使用します。したがって、Windows 認証とフォーム認証は一緒にプレイできます。

まったく同じ状況ではありませんが、すべてが正常に機能している場合に見落とされる重要な違いが強調されています。
すぐに読む価値があります... http://msdn.microsoft.com/en-us/library/system.security.claims.claimsprincipal.current

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Security.Principal;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web;


namespace BosIdentityManager
{
public class BosPrincipal
{
    /// <summary>
    /// The current principal is set during FORMS authentication.  If WINDOWS auth mode is in use, Windows sets it.
    /// </summary>
    /// <returns> The Name from Thread.CurrentPrincipal.Identity.Name unless alternate delegate is configured</returns>  
    public static string GetCurrentUserName()
    {
    //   http://msdn.microsoft.com/en-us/library/system.security.claims.claimsprincipal.current   
    //  with forms auth and windows integrated,ClaimsPrincipal.Current will be set.

        var prin = ClaimsPrincipal.Current;  //normally this reverts to Thread.CurrentPrincipal, but can chnage !
        return prin.Identity.Name;

    }

    public static string GetCurrentWindowsUserName()
    {
        return WindowsIdentity.GetCurrent().Name;   
    }

    public static void SetPrincipal(BosMasterModel.Membership memb)
   {
       var claims = new List<Claim>(){ new Claim(ClaimTypes.Name, memb.SystemUser.UserName),
                                       new Claim(ClaimTypes.NameIdentifier,memb.UserId.ToString()),
                                       new Claim(ClaimTypes.Role, "SystemUser") };

       var ClaimsId = new ClaimsIdentity(claims,"Forms");

       var prin = new ClaimsPrincipal(ClaimsId);
       Thread.CurrentPrincipal = prin;

   }
}
}
于 2012-10-05T03:33:31.070 に答える