2012-02-12 18 views
6

私はMVCを初めて使用しており、実際にはWeb開発には全く新しいものです。私は約7年間の開発経験を持っていますが、サービス、データベース、オブジェクトモデルなどでは、基本的に中間層とバックエンドの開発です。私はASP.NETを学びたいと思っており、MVC3を使用して自分用の個人用サイトを構築することに決めました。私はdotnet-hosts.comのアカウントからこれをホストします。ここに私の質問です...私はドメインを持っていないと私は組み込みのメンバーシッププロバイダを使用しています。私は、私の質問はUser.Identity.Nameの周りに、具体的であるMVC3 +現在ログインしているユーザーのユーザー名を取得する方法

MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */); 

...私は方法ChangePasswordAccountControllerChangePasswordModelモデル)でのコード行があることをプロジェクトテンプレートを追加したときに作成されたコードを自動生成に気づきましたこれは、Windowsユーザー名を返すように見えます。Environment.UserNameのようになります。私が使用したVisual Studioのテンプレートは、(モバイル対応のHTML5 MVC.NET)、どのデバイスからでもクライアントをサポートできるようにしています... Windows PC、Apple、Windows Phone、iPhoneなど... User.Identity.Name正しいですが、私はiPhoneのようなWindowsではないデバイスでこれがどのように機能するのか尋ねたいと思いますか?私の前提が正しければ、これはドメインを持つWindowsコンピュータでのみ機能しますが、どのようにこれを達成できますか?多分キャッシングを使用する必要がありますか?もしそうなら、認証ページからキャッシュキーとして使用するユーザー名とそのIPアドレスを取得することはできますか?

私の高レベルの質問は...デバイス/プラットフォームに関係なく、現在ログインしているユーザーのuserNameを取得するにはどうすればよいですか?私はこの質問がおそらくよく書かれておらず、理解するのが難しいかもしれないことを知っています...私はそれをお詫びします。私はウェブ開発には新しく、足を濡らすために努力しており、最新のテクノロジーを使い始めたいと考えています。

答えて

4

あなたが言っているように、User.Identity.Nameは本当に正しいです。ログインしたユーザー名を返すためのものです。しかし、あなたのようなメンバーシップセクションでは、Windowsアカウントのみを提供しています。 Windowsアカウントのユーザーでなくても同様の方法を使用して、すべてのシナリオで動作させることができます。あなたがメンバシップなしでそれを呼び出すと、デフォルトのMVC3テンプレートに従っていればうまくいくはずです。

String Username = User.Identity.Name; 

テンプレートMVC3を使用してログオンすると、authcookieが作成されます。 アカウントコントローラコードを参照してください。ここでは、2つのパラメータが渡されます。ユーザー名を保持し続ける(ブラウザが閉じられてもログインはキャッシュされます)。

ユーザー名はUser.Identity.Nameと呼ばれるもので、実際には何も入力することができず、Windowsログインにリンクされていません。

あなたが望む方法でログインをテストすることができます。もしそうなら、authcookieメソッドを使ってクッキーを設定します。 (そのencripted)。そして、あなたが望むものにユーザー名を設定してください。ユーザーの確認に失敗した場合は、ユーザーを作成せずにページに戻ってください。

サンプルコードを参照してください。参考までに私のコードは私にはありませんので、これはすべてメモリからです。しかし、そのすべてがアカウントコントローラのログインアクションにあります。

クッキーが設定されていると、ユーザーのログイン状態がセッション用にキャッシュされます。 Webページにアクセスしたときにユーザーがログインしていることを確認する必要があります。それ以外の場合、ログインは無意味です。これはコントローラ/アクションの単純な属性です。

注:ログインしていないので、ログオンページにアクセスすることはできませんので、アカウント/ログオンコントローラにはこの操作を行わないでください。

[Authorize] 
public ActionResult DoSomething() 
{ 
    // ... 
} 

希望しました。

6

呼び出しが正しいです。 User.Identity.Nameには、Windows認証、フォーム認証、カスタム認証プロバイダなど、使用されている認証プロバイダーによって入力が行われます。これは、特定のユーザー "タイプ"にバインドされていません。認証プロバイダは、すべての要求に対してIdentityオブジェクトが現在のユーザに対応することを確認する責任があります。通常、その部分はクッキーとデータベースの組み合わせを使用して世話をします。

MVCテンプレート(私はMVC 2以降のテンプレートを見て持っていなかったが)今度はメンバシッププロバイダを使用してASP.NETのMembershipクラスを使用しています - たとえばSqlMembershipProviderActiveDirectoryMembershipProviderのために - 旧店舗ユーザーのにSQL Serverデータベースの資格情報(ユーザー名とパスワードなど)は、Active Directory(主にWindowsログオン)を使用します。 SqlMembershipProviderがデフォルトであり、MVCはユーザストアとしてローカルSQLExpressデータベースファイルを使用するように設定されています。

テンプレートプロジェクトで実装されている認証プロバイダは、LogOnビュー内にある単純なHTMLフォームを使用してログイン手続きを行い、暗号化されたCookieを使用してユーザーをサインインするようにするFormsAuthenticationを使用します。どのプラットフォームでも動作します。

FormsAuthenticationとSqlMembershipProviderの両方の設定は、web.config(サイトのルートにあるもの)にあります。ここでは、SQLExpressデータベースの接続文字列を見つけることができます(必要に応じて「実際の」SQL Serverを使用するように変更するなど)。ログインのタイムアウトなど。

Visual Studioのソリューションエクスプローラのツールバーにある[ASP.NET設定]ボタンを使用してGUIで実行すると、最初のユーザーを簡単に設定できます)。

要するに、すべての準備が整いました。Windows以外のユーザーをロックアウトしません。

関連する問題