1

コントローラにあるすべてのログインデータを含むオブジェクトがあります(MVC3に切り替える前にプログラムされています)。

サイトに認証を追加しようとしていますが、これまでのところ、次のようになっています。

public LoginObject MyLoginObject
{
   get;
   set;
}

[CustomAuthorization()]
public ActionResult Index()
{
 return View();
}

public class CustomAuthorization : AuthorizeAttribute
{
   protected override bool AuthorizeCore(HttpContextBase httpContext)
   {
    return true;
    //should be return myLoginObject.IsLoggedIn;
   }
}

MyLoginObjectをAuthorizeAttributeクラスに渡す方法はありますか?そうでない場合は、少なくとも、ユーザーが許可されているかどうかを指定するオブジェクトからブール値を渡すことができますか?

編集: Zonnenbergのアドバイスに基づく私の解決策。

public class LoginObject : IPrincipal // Now extends IPrincipal 
{
   ... //old code
   private class IdentityImpl : IIdentity
{
  public string AuthenticationType
  {
    get;
    set;
  }

  public bool IsAuthenticated
  {
    get;
    set;
  }

  public string Name
  {
    get;
    set;
  }
}

public IIdentity Identity
{
  get { return new IdentityImpl { AuthenticationType = "Custom Authentication", IsAuthenticated = this.IsLoggedIn, Name = this.Id}; }
}
}

次に、loginobjectのインスタンス化をCustomAuthorizationに移動しました

public override void OnAuthorization(AuthorizationContext filterContext)
{
  // ... Set up LoginObject
    filterContext.RequestContext.HttpContext.User = myLoginObject;

  base.OnAuthorization(filterContext);
}

これで、ログインは認証内で行われ、ユーザーを呼び出してコントローラーからログインにアクセスできます。

4

2 に答える 2

2

httpContext.User.Identity.IsAuthenticatedを使用して、ユーザーがログインしているかどうかを確認できます。

より多くの情報を保存するには、httpContext.Userオブジェクトを使用できます。IPrincipalおよびIIdentityの独自の実装を記述して、あらゆる種類のログイン情報を格納できます。

他のオプションは、セッションにログイン情報を保存することです。

于 2011-06-21T22:20:28.353 に答える
0

LoginObjectはどのようにインスタンス化されますか?

サービスまたはリポジトリを介してインスタンス化されている場合(たとえば、MyLoginObject = loginService.GetLogin()この呼び出しをCustomAuthorization属性に移動できます。

ロジックがコントローラー自体の中にある場合は、ソリューションアーキテクチャに応じて、これをサービスまたはリポジトリにリファクタリングして、上記を実行できるようにする必要があります。

于 2011-06-22T15:52:21.880 に答える