1

そのため、私は独自のカスタムメンバーシッププロバイダーを実装しました。現在、ValidateUser()のみを上書きしています。また、Signalrも機能しています。現在は、send messageを呼び出して、それをすべてのリスナーに送信する単純なメソッドです。このコマンドを単独で実行できないように、検証チェックを追加したいと思います。これまでのところ、Context.User.Identity.IsAuthenticatedを使用してこれを実行できることがわかりました。

[HubName("messageController")]
public class MessageController : Hub
{
    public void SendMessage(string message)
    {
        if (Context.User.Identity.IsAuthenticated)      // this line not working
        {
            Clients.addMessage(message);
        }
        else
        {
            Clients.addMessage("not authenticated");
        }
    }
}

私の問題は、現在カスタムメンバーシッププロバイダーの値を使用しているためです。代わりにここで使用する必要があるものは他にありますか?

現在、ログインすると次のように実行します。

    [AllowAnonymous]
    [HttpPost]
    public ActionResult Login(LoginModel model, string returnUrl)
    {
        if(Membership.ValidateUser(model.UserName, model.Password))
        {
            // Need something here to actually set the logged in user
        }
        return RedirectToAction("Index", "");
    }

ここで何が欠けていますか?セッションを処理するために独自のコードを保存する必要がありますか?FormsAuthentication.SetAuthCookie(model.UserName, true);うまくいったものを使用してみましたが、間違いだと確信しています。ロールを変更して導入しようとすると、Context.User.IsInRole("Admin")falseが返されました。以下のユーザーモデルを使用しましたが(デバッグ時にこのメソッドに到達することはありません):

public class User : IPrincipal
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }


    public long UserID;
    public string Name;
    public string ConnectionId;

    public virtual IIdentity Identity
    {
        get;
        set;
    }

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

}

私はこれで何かが欠けているとかなり確信しています、何かアイデアはありますか?

4

1 に答える 1

3

FormsAuthentication.SetAuthCookie()ユーザーが完全にOKであることを検証した後で使用AccountControllerすると、MVC3テンプレートによって作成されたデフォルトはまったく同じになります。

の呼び出しが機能しない理由Context.User.IsInRole()は、カスタムUserクラスが呼び出されないため(フレームワークはそれを認識しないため)、代わりにを介してロールを取得しようとしますRoleProvider。メンバーシッププロバイダーの場合と同様に、カスタムプロバイダーを作成し、それをWeb.configに接続する必要があります。

于 2012-09-06T16:32:59.503 に答える