9

私はFormsAuthenticationを使用しようとしており、現時点ではユーザー名とパスワードで正常に動作しています。フォーム認証チケットにユーザーロールを追加する必要があり、ASP.NETメンバーシップを使用していません。FormsAuthenticationメンバーシップのないロール

if (rep.CheckUser(model.UserName, model.Password,out UserRole))//Check User 
    { 

    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

// Roles.AddUserToRole(model.UserName, UserRole);//This Requires Membership 

    return Redirect(FormsAuthentication.DefaultUrl); 

} 
+0

あなたは現在、ロールの操作にどのメカニズムを使用していますか? –

+0

@HuseinRoncevic私のデータベーステーブルでは、私はUser.UのUserName、Password、Roleを持っています。データベースから取得したRoleを認証チケットに渡したいと思います。 – chamara

+0

このように動作しているかわかりません。あなたは認証クッキーにユーザー名を入れて、次に入力要求ごとに認証クッキーからユーザー名を読み取り、データベースから他の詳細を読み込みます。これは 'ActionFilter'で行うことができます。 – Suhas

答えて

20

FormsAuthenticationTicketコンストラクタ(ほとんどのパラメータを持つもの)は文字列を取りuserDataパラメータがあります。パイプ(|)やハッシュのような文字で区切られた役割を追加することができます。どのように使用する予定ですかはあなた次第です。通常は、AuthenticateRequestイベントを登録することです。だから、あなたがチケットを作成することができ、これはだった:今、あなたはIPrincipalオブジェクト(HttpContext.Current.User)で役割を持っているとあなたが照会すると

public override void Init() 
{ 
    base.AuthenticateRequest += OnAuthenticateRequest; 
} 

private void OnAuthenticateRequest(object sender, EventArgs eventArgs) 
{ 
    if (HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     var cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 
     var decodedTicket = FormsAuthentication.Decrypt(cookie.Value); 
     var roles = decodedTicket.UserData.Split(new[] {"|"}, StringSplitOptions.RemoveEmptyEntries); 

     var principal = new GenericPrincipal(HttpContext.Current.User.Identity, roles); 
     HttpContext.Current.User = principal; 
    } 
} 

:その後

private void CreateTicket() 
{ 
    var ticket = new FormsAuthenticationTicket(
      version: 1, 
      name: UserName, 
      issueDate: DateTime.Now, 
      expiration: DateTime.Now.AddSeconds(httpContext.Session.Timeout), 
      isPersistent: false, 
      userData: String.Join("|", arrayOfRoles)); 

    var encryptedTicket = FormsAuthentication.Encrypt(ticket); 
    var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 

    httpContext.Response.Cookies.Add(cookie); 
} 

global.asaxにあなたはこのような何かをするだろうHttpContext.Current.User.IsUserInRole("RoleName")あなたは真または偽を得るでしょう。そうすれば、プロバイダーRolesの使用を避けることができます。

更新:BeginRequestではなく、Application_AuthenticateRequestというユーザープリンシパルの再作成を処理するためのより良いイベントが呼び出されます。これを反映するようにコードを更新しました。

+3

いいえ、ユーザーが認証されていない場合はnull参照例外がスローされます。代わりに 'base.PostAuthenticateRequest + = OnAfterAuthenticateRequest;'を使用してください。 – Burjua

+1

良い答え。しかし、標準のFormsAuthorizationを使用している場合、チケットを再度解読する必要はありません。単にvar decodedTicket =((FormsIdentity)HttpContext.Current.User.Identity).Ticket; ' – kape123

+0

私は試していませんこれは主に私がチケットを暗号化しているためです。しかし、私はそれを撃つだろう。ありがとう。 –

関連する問題