フォーム認証を使用して、ASP.NET フレームワーク内でカスタム メンバーシップおよびロール プロバイダーを使用しています。これらはうまく機能しています。ロール プロバイダーは、Cookie を使用してロールを永続化し、Web 要求ごとにデータベースへのトリップを保存します。また、FormsAuthenticationTicket 内で UserData 文字列を使用して UserId を格納しています。
DAL を Web プロジェクトから独自のプロジェクトにリファクタリングする必要があります。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);
}
}