ASP.NETフレームワーク内でフォーム認証を使用してカスタムメンバーシップとロールプロバイダを使用しています。これらは素晴らしい作品です。ロールプロバイダはクッキーを使用してロールを保持し、各Webリクエストでデータベースへの移動を保存します。私はUserAdを格納するためにFormsAuthenticationTicket内のUserData文字列も使用しています。RolePrincipalをカスタムIPrincipalオブジェクトにラップすることはできますか?
ウェブプロジェクトからDALを自分のプロジェクトにリファクタリングする必要があります。 DALは、現在のユーザーのIDを取得することと、権利のロールをチェックすることに依存しています。 DALプロジェクトでSystem.Webを参照せずにThread.CurrentPrincipalを使用できるように、認証システムがどのように変更されるべきですか?
現在、Provider FrameworkはRolePrincipalおよびFormsIdentityオブジェクトを作成し、Thread.CurrentPrincipalにアタッチします。
私は、Application_PostAuthenticateRequestイベント中にRolePrincipalの周りにカスタムIPrincipalラッパーを作成することを考えました。このイベントでは、私はFormsAuthenticalTicketからUserIDを取得し、それをRolePrincipalと共にこの新しいwrapperPrincipalに渡すことができます。
これは有効なアプローチですか?私は、プロバイダの構造を乱すことによってプロジェクトでいくつかの問題をさらに深刻化させるでしょうか?
ありがとう、 キース
protected void Application_PostAuthenticateRequest()
{
if (Request.IsAuthenticated)
{
FormsIdentity identity = (FormsIdentity)User.Identity;
if (identity != null)
{
FormsAuthenticationTicket ticket = identity.Ticket;
int id = 1;
if (identity != null)
{
int.TryParse(identity.Ticket.UserData, out id);
}
var wrapperPrincipal = new WrapperPrincipal(User, id);
System.Threading.Thread.CurrentPrincipal = WrapperPrincipal;
}
}
}
[Serializable]
public class WrapperPrincipal : IPrincipal
{
private IPrincipal principal;
public WrapperPrincipal(IPrincipal principal, int userId)
{
this.principal = principal;
this.Id = userId;
}
public int Id { get; set; }
public IIdentity Identity
{
get { return principal.Identity; }
}
public bool IsInRole(string role)
{
return principal.IsInRole(role);
}
}
私は疑いがあり、あなたの質問の結果に本当に興味があります。あなたが何かに来た場合、あなたの結論を共有することはできますか? –
IPrincipalを使用せずにRolePrincipalでWrapperPrincipalを拡張し、IPrincipalの実装メソッドとプロパティを削除するだけです。 RolePrincipalはIPrincipalを実装しています – user357086