4

カスタム IIdentity 実装があります。

public class FeedbkIdentity : IIdentity
{
    public int UserId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public string Name { get; set; }

    public FeedbkIdentity() 
    {
        // Empty contructor for deserialization
    }

    public FeedbkIdentity(string name)
    {
        this.Name = name;
    }

    public string AuthenticationType
    {
        get { return "Custom"; }
    }

    public bool IsAuthenticated
    {
        get { return !string.IsNullOrEmpty(this.Name); }
    }
}

およびカスタム IPrincipal

public class FeedbkPrincipal : IPrincipal
{
    public IIdentity Identity { get; private set; }

    public FeedbkPrincipal(FeedbkIdentity customIdentity)
    {
        this.Identity = customIdentity;
    }

    public bool IsInRole(string role)
    {
        return true;
    }
}

global.asax.cs で FormsAuthenticationTicket userData を逆シリアル化し、置き換えています

HttpContext.Current.User:

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];

    if (authCookie != null)
    {
        FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);

        JavaScriptSerializer serializer = new JavaScriptSerializer();

        FeedbkIdentity identity = serializer.Deserialize<FeedbkIdentity>(authTicket.UserData);

        FeedbkPrincipal newUser = new FeedbkPrincipal(identity);
        HttpContext.Current.User = newUser;
    }
}

次に、Razor ビューで次のことができます。

@(((User as FeedbkPrincipal).Identity as FeedbkIdentity).FirstName) 

私はすでに Ninject を使用してメンバーシップ プロバイダーのカスタム ユーザー リポジトリを挿入しており、IPrincipal を HttpContext.Current.User にバインドしようとしています。

internal class NinjectBindings : NinjectModule
{
    public override void Load()
    {
        Bind<IUserRepository>().To<EFUserRepository>();
        Bind<IPrincipal>().ToMethod(ctx => ctx.Kernel.Get<RequestContext>().HttpContext.User).InRequestScope();
    }
}

しかし、うまくいきません。

私がやろうとしているのは、次のようにカスタム IIdentity プロパティにアクセスできるようにすることだけです。 @User.Identity.FirstName

どうすればこれを機能させることができますか?

編集

ここで提案されているように、IPrincipal を HttpContext.Current.User にバインドすることで期待していました: MVC3 + Ninject: ユーザー IPrincipal を注入する適切な方法は何ですか? アプリケーションでアクセスできるようになり@User.Identity.FirstNameます。

そうでない場合、リンクされた質問に示されているように、IPrincipal を HttpContext.Current.User にバインドする目的は何ですか?

4

2 に答える 2

3

独自のベース WebViewPage を作成することをお勧めします。http://haacked.com/archive/2011/02/21/ching-base-type-of-a-razor-view.aspxを参照してください。

次に、その中であなたができること

public FeedbkPrincipal FeedbkPrincipal
{
    get
    {
        return User as FeedbkPrincipal;
    }
}

public FeedbkIdentity FeedbkIdentity
{
     get
     {
         return FeedbkPrincipal.Identity as FeedbkIdentity;
     }
}

それならただ

@FeedbkIdentity.FirstName

ビュー内。

リンクされた質問に示されているように、IPrincipal を HttpContext.Current.User にバインドする目的は何ですか

依存性注入により、実行時にコンポーネントを選択できます。与えられた例では、あなたはすることができます

public MyClassConstructor(IPrincipal principal) { // }

IPrincipal は自動的にユーザーにバインドされます。実行時に type になる場合でも、クラスはそれを認識しないFeedbkPrincipalため、これにより特定のプロパティにアクセスできないことに注意してください。FeedbkPrincipal具象クラスにアクセスする方法が必要なため、依存性注入は現在の問題の解決策ではありません。

于 2012-05-09T00:07:27.687 に答える
1

それが正しく設定されていると仮定するとHttpContext.User、グローバル フィルターを作成して、自動的ViewBagFeedbkIdentity.

例えば

作成する

public class FeedbkPrincipalIntoViewBagAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var principal = filterContext.HttpContext.User as FeedbkPrincipal;
        if (principal != null)
        {
            filterContext.Controller.ViewBag.Identity = principal.Identity as FeedbkIdentity;
        }
    }
}

登録する

protected void Application_Start()
{
    GlobalFilters.Filters.Add(new FeedbkPrincipalIntoViewBagAttribute());
}

これを使って

@ViewBag.Identity.FirstName
于 2012-05-09T00:26:31.653 に答える