ASP.NETでIPアドレスログイン管理を教えてください

このQ&Aのポイント
  • 現在、クライアントのIPアドレスを取得してSQLServerテーブルでログイン管理をするWebを作成したい
  • ASP.NET自体あまり理解できておらず、困っている
  • VBコードでIPアドレスを取得し、SQL Serverに接続後にエラーメッセージとメインページ表示を分岐したいが、分からない
回答を見る
  • ベストアンサー

ASP.NETでIPアドレスログイン管理を教えてください

こんばんわ。 現在、クライアントのIPアドレスを取得してSQLServerテーブルでログイン管理をするWebを作成したいと思っております。 ずっと調べていたのですが分からず、実はまだASP.NET自体あまり理解できておりません。書籍などで勉強してから投稿しろ!と思われるかもしれませんが時間がなく困っています。 どうかご教示を宜しくお願い致します。 わかる範囲で.vbにコードを書いてみましたがIPアドレスを取得してSQL Serverに接続後にIF文でエラーメッセージとメインページ表示を分岐したいのですが分らないのです。。。 Partial Class INDEX Inherits System.Web.UI.Page Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load 'ページを初期化するユーザーコードをここに挿入します。 If Not IsPostBack Then '---------IPアドレス取得--------------- Dim strHost As String Dim ip As System.Net.IPHostEntry Dim ipAddr As System.Net.IPAddress 'ホスト名を取得 strHost = System.Net.Dns.GetHostName() 'IPリストを取得 ip = System.Net.Dns.GetHostByName(strHost) 'IPリストの最初を取得 ipAddr = ip.AddressList(0) '---------SQL接続--------------- Dim cn As SqlConnection = New SqlConnection("Server=servername;database=data;UID=id;PWD=pass") Dim cmd As SqlCommand = New SqlCommand("SELECT * FROM IPAdd WHERE IP='" & ipAddr & "' AND Authority1='True'") cn.Open() Dim reader As SqlDataReader = cmd.ExecuteReader() DemoGrid.DataSource = reader DataBind() reader.Close() cn.Close() End If End Sub End Class

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

ASPと違ってvbファイル内にHTMLコードを直書きしてもページには反映されません # やってやれないことは無いのですが ... 適切なページへ遷移する方法を考えたほうが良いように思います もしテスト的にやりたいのであれば Loadイベントで判断だけしてフラグをセットします LoadComplateイベントでフラグを判断材料にしてResponse.Writeを使ってHTMLを吐き出すとか ログインのコントロールならツールボックスの中の『ログイン』グループにあるコントロールを使うことをお勧めします Framsetは ASP.NETと相性がよくありません パネルコントロールなどを使ってフレーム分けしたほうが良いように思います .NET Framework SDKの『QuickStartチュートリアル』をインストールして基本的な使い方を学習しましょう

earlgyreprince
質問者

お礼

>Framsetは ASP.NETと相性がよくありません そうなんですか? パネルコントロールが分からないのですが調べてみます! >.NET Framework SDKの『QuickStartチュートリアル』をインストール>>して基本的な使い方を学習しましょう もう1度勉強し直します。 ご教示いただきましてありがとうございました☆

その他の回答 (3)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

回避出来ると思いますよ ちょっと間違ってましたけど … 正解は Imports System.Data.SqlClient でした DataとSqlClientの間に『.』が必要でした エラー等はまず自分で調べるといった姿勢が必要ですよ MicrosoftのMSDNライブラリーーなどで …

参考URL:
http://msdn2.microsoft.com/ja-jp/library/default.aspx
earlgyreprince
質問者

補足

ありがとうございます! >エラー等はまず自分で調べるといった姿勢が必要ですよ おっしゃる通りです。すみません。 今回、ご教示頂いたアドバイスを元に自分なりに投稿通りのコードを作ってみましたので見て頂けますでしょうか? HTML部分の表示はvb内では使えないのでしょうか? また、おかしいとお気づきの部分がありましたらご指導願います。 本当に何度も申し訳ございませんが何卒、宜しくお願い致します。 -------------------ソース--------------------- Imports System Imports System.Data Imports System.Data.SqlClient Imports Microsoft.VisualBasic Imports System.Text Partial Class INDEX Inherits System.Web.UI.Page Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Run() End Sub Public Sub Run() '------------- IPアドレス取得 -------------- Dim ipAddr As String ipAddr = Request.UserHostAddress '------------- SQL Server Connection -------------- Dim myDataReader As SqlDataReader Dim mySqlConnection As SqlConnection Dim mySqlCommand As SqlCommand mySqlConnection = New SqlConnection("Server=SQL;database=Web;UID=id;PWD=pass") mySqlCommand = New SqlCommand("SELECT * FROM IPAdd WHERE IPAddress='" & ipAddr & "' AND Authority1='True'") mySqlConnection.Open() myDataReader = mySqlCommand.ExecuteReader(CommandBehavior.CloseConnection) Do While (myDataReader.Read()) Loop If Not (myDataReader Is Nothing) Then <CENTER> <h2>この端末からは閲覧できません。</h2> Else <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META http-equiv="Content-Style-Type" content="text/css"> <TITLE>メイン</TITLE> </HEAD> <FRAMESET rows="97,*" border="0" frameborder="0"> <FRAME src="Title.html" name="ue" scrolling="no" /> <FRAMESET cols="50%,*" border="0" frameborder="0"> <FRAME src="Left.html" name="hidari" /> <FRAME src="Right.html" name="migi" /> </frameset> </body> </html> End If myDataReader.Close() mySqlConnection.Close() End Sub End Class

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

波線が表示されているのであれば参照設定を確認してみましょう Systemからの完全修飾名で記述してOKなら Importsステートメントを追加することで回避が可能です SQL関連なら Imports System.DataSqlClient をVBファイルの先頭付近に記述してみましょう IDEの 表示 > エラー一覧 などでエラーになっている箇所の詳細を確認できると思いますよ EEは使ってないので この機能が無いかもしれませんが …

earlgyreprince
質問者

補足

ありがとうございます。 波線のアプリケーションを実行するとコンパイルエラーができました。 '/webap' アプリケーションでサーバー エラーが発生しました。 -------------------------------------------------------------------------------- コンパイル エラー 説明: この要求を送信するために必要なリソースをコンパイル中に、エラーが発生しました。以下のエラーの詳細を確認して、ソース コードを修正してください。 コンパイル エラー メッセージ: BC30002: 型 'SqlConnection' が定義されていません。 ソース エラー: 行 14: 'sqlConnectionオブジェクトを作成します。 行 15: '使用環境に応じて接続文字列を変更します。 行 16: Dim cn As SqlConnection = New SqlConnection("Server=servername;database=data;UID=id;PWD=pass") 行 17: Dim cmd As SqlCommand = New SqlCommand("SELECT * FROM IPAdd WHERE IP='" & ipAddr & "' AND Authority1='True'") 行 18: ソース ファイル: \\server\web\test\web\webap\INDEX.aspx.vb 行: 16 -------------------------------------------------------------------------------- バージョン情報: Microsoft .NET Framework バージョン:2.0.50727.42; ASP.NET バージョン:2.0.50727.210 です。 Imports System.DataSqlClient をVBファイルの先頭付近に記述すれば回避できるのでしょうか? ご教示宜しくお願い致します。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

クライアントのIPアドレスの取得には HttpRequestのUserHostAddressを使ったほうが良いと思いますよ Dns.GetHostNameではWebサーバーのIPが取得されるだけだと思います dim ipAddr as String ipAddr = Request.UserHostAddress といった具合です

earlgyreprince
質問者

補足

redfox63さん ありがとうございます! 変更してみます☆ SQL Serverの接続コードは正しいのでしょうか? WebDeveloperでは Dim cn As SqlConnection = New SqlConnection・・・ Dim cmd As SqlCommand = New SqlCommand・・・ 2個所に波線が表示されるので気になりました。 よろしくお願い致します。

関連するQ&A

  • ADO.NETの処理分岐について教えて下さい。

    クライアントから取得したIPアドレスとDBの登録が一致した場合のみフォームを 出力するアプリケーションを作成しているのですがDBの登録があってもエラーのフォームの 分岐に行ってしまいます。 どこが違うのでしょうか?教えて下さい。 ASP.NETを勉強し始めて間もないのでまだまだ勉強不足ですが宜しくお願い致します。 Imports System Imports System.Data Imports System.Data.SqlClient Imports Microsoft.VisualBasic Imports System.Text Partial Class INDEX Inherits System.Web.UI.Page Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load '------------- IPアドレス取得 -------------- Dim ipAddr As String ipAd = Request.UserHostAddress '------------- SQL Server Connection -------------- Dim myDataReader As SqlDataReader Dim mySqlConnection As SqlConnection Dim mySqlCommand As SqlCommand mySqlConnection = New SqlConnection("Server=Name;database=Source;UID=id;PWD=pw") mySqlCommand = New SqlCommand("SELECT * FROM IPdb WHERE IPAddress='" & ipAd & "' AND sub='True'") mySqlConnection.Open() mySqlCommand.Connection = mySqlConnection myDataReader = mySqlCommand.ExecuteReader(CommandBehavior.CloseConnection) Do While (myDataReader.Read()) Loop If Not (myDataReader Is Nothing) Then Response.Redirect("LoginError.aspx") Else End If myDataReader.Close() mySqlConnection.Close() End Sub End Class

  • asp.netでのセッションを使用したログイン

    asp.netでmssql server を利用してログイン機能を実装しました。 以下のようなコードでmssqlに保存してあるIDとパスが一致すれば 以降の画面ではセッションにID、パスが保存され page loadでセッションにID、パスがなかればページがすすんでいけないような設定にしています。 機能は問題なく動作しているのですがこのような仕様はセキュリティ上問題はないのでしょうか。 商用サイトではないのですが、ある程度広域に向けたサイトを構築しようと考えておりまして、セキュリティ向上のため、工夫できるようなことがあればご意見いただきたいです。 よろしくお願いいたします。 ************************************************************** ログインページ ************************************************************** Dim staffid As Integer Dim staffname As String Dim adminflag As Boolean Protected Sub btnLogon_Click(ByVal sender As Object, ByVal e As System.EventArgs) 'ユーザーIDの入力チェック If txtUserID.Text = "" Then lblErr.Text = "ユーザーIDを入力してください。" Return End If 'パスワードの入力チェック If txtpassword.Text = "" Then lblErr.Text = "パスワードを入力してください。" Return End If 'ユーザーとパスワードの検証 If Not CheckUserPassword(txtUserID.Text, txtpassword.Text) Then lblErr.Text = "ユーザーIDまたはパスワードが違います。" Return End If 'セッション変数へ値をセットする Session("StaffID") = staffid Session("StaffName") = staffname Session("AdminFlag") = adminflag End Sub Private Function CheckUserPassword(ByVal userid As String, ByVal password As String) As Boolean Dim ret As Boolean Dim strSQL As String strSQL = "SELECT staffID, staff_name, admin_flag , permission FROM tbl_staff " & _ "WHERE userID = '" & userid.Replace("'", "''") & _ "' AND password = '" & password.Replace("'", "''") & "'" '接続文字列を取得する Dim cnStr As String = System.Configuration.ConfigurationManager.ConnectionStrings("hogehogeConnectionString").ConnectionString() 'コネクションを定義する Using connection As New SqlConnection(cnStr) 'コマンドを定義する Dim command As New SqlCommand(strSQL, connection) 'コネクションを開く connection.Open() Try 'コマンドからデータリーダーを定義する Dim dr As SqlDataReader = command.ExecuteReader 'データリーダーから結果を読み込む If dr.Read Then '対象データが存在する場合 '正しいユーザーIDとパスワードが指定されたので、 'データリーダーから読み出したデータをメンバ変数にセットする staffid = dr("staffID") staffname = dr("staff_name") adminflag = dr("admin_flag") permission = dr("permission") ret = True Else '対象データが存在しない場合 '不正なユーザーIDまたはパスワードが指定された ret = False End If Catch ex As Exception '例外処理(SQLエラーなど) ret = False End Try 'コネクションを閉じる connection.Close() End Using '結果を返して終了する Return ret End Function ************************************************************** ログイン後に行くページでの設定 ************************************************************** Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) '[ユーザーID]ボックスにフォーカスをセットする If Session("StaffID") Is Nothing Then Response.Redirect("~/top.aspx") ElseIf Not Session("AdminFlag") = True Then Response.Redirect("~/top_normal.aspx") End If End Sub

  • VB.NET2005からoracle92へ接続するには?

    IDとパスワードを入力し、オラクルのDBにあるIDとパスワードだったら次の画面を開くというプログラムを作りたいです。 オラクルへの接続がうまく行ってないようで画面が固まってしまいます。 プログラムの不具合を教えていただけないでしょうか? よろしくお願いします。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim cn As New OleDb.OleDbConnection() Dim cmd As New OleDb.OleDbCommand() Dim rs As OleDb.OleDbDataReader cn.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=*;User ID=*;Password=*;" cn.Open() '←ここで、エラーになります。 cmd = cn.CreateCommand() cmd.CommandText = "Select ID from abc" rs = cmd.ExecuteReader() While rs.Read() If TextBox1.Text = cmd.CommandText Then MessageBox.Show("パスワードを受付けました。") Dim frm2 As New Form2 frm2.Show() TextBox1.Clear() TextBox2.Clear() Else MessageBox.Show("パスワードが違います。") TextBox1.Text = "" TextBox1.Focus() TextBox1.Clear() TextBox2.Clear() End if     End While cn.Close() rs.Close() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Me.Close() End Sub End Class

  • VB.NET2005からoracle92へ接続する方法。

    IDとパスワードを入力し、オラクルのDBにあるIDとパスワードだったら次の画面を開くというプログラムを作りたいです。 オラクルへの接続がうまく行ってないようで画面が固まってしまいます。 プログラムの不具合を教えていただけないでしょうか? よろしくお願いします。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim cn As New OleDb.OleDbConnection() Dim cmd As New OleDb.OleDbCommand() Dim rs As OleDb.OleDbDataReader cn.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=*;User ID=*;Password=*;" cn.Open() '←ここで、エラーになります。 cmd = cn.CreateCommand() cmd.CommandText = "Select ID from abc" rs = cmd.ExecuteReader() While rs.Read() If TextBox1.Text = cmd.CommandText Then MessageBox.Show("パスワードを受付けました。") Dim frm2 As New Form2 frm2.Show() TextBox1.Clear() TextBox2.Clear() Else MessageBox.Show("パスワードが違います。") TextBox1.Text = "" TextBox1.Focus() TextBox1.Clear() TextBox2.Clear() End if     End While cn.Close() rs.Close() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Me.Close() End Sub End Class

  • VB.Net SqlCommand 共通に

    お世話になります。 VB.Net 駆け出しの者です。 SqlCommand を使いストアドプロシジャーを実行して戻り値を DateSet にするような関数はプログラムを作っていくと、かなり多数になるようになりました。接続文字列だったり、いろいろ同じような記述が続いているなと思っておりました。 そこで、以下のような関数を作り、この部分を使いまわせないものかと思っております。 ストアドプロシジャーの名前や、そのほか必要な部分の文字はすべて変数にして、なんとか使えないのかなと思っているのですが、問題なのは、パラメータの部分でうまくいかないのです。 パラメータの部分だけ別関数にして、なんとかねじこめないかなと思っているのですが・・・ そもそもこういうやり方が正しいのかどうかもわからないのですが、その辺りも含めご教授いただければ幸いでございます。 何卒よろしくお願いいたします。 Public Function CommonDataSet(ByVal NameStored As String, ByVal CMDPara As SqlCommand, ByVal BasicTableName As String, ByVal ErrStr As String, ByVal ErrStrCaption As String) As DataSet     Dim SQLCon As SqlConnection = New SqlConnection(CMO.GetConnectStrings())     Try       CMDPara = New SqlCommand(NameStored, SQLCon)       CMDPara.CommandType = CommandType.StoredProcedure       SQLCon.Open()       Dim custDA As SqlDataAdapter = New SqlDataAdapter       Dim custDS As DataSet = New DataSet       ’この部分で下記の関数でパラメータを設定したいのですが、うまくいきません       custDA.SelectCommand = CMDPara       custDA.Fill(custDS, BasicTableName)       CommonDataSet = custDS     Catch ex As Exception       Err.Raise(Err.Number)       MessageBox.Show(ErrStr, ErrStrCaption, MessageBoxButtons.OK, MessageBoxIcon.Warning)       CommonDataSet = Nothing     End Try     If SQLCon.State <> ConnectionState.Closed Then       SQLCon.Close()       SQLCon.Dispose()     End If End Function パラメータを設定する関数 上の関数の引数として設定したいのです  ByVal CMDPara As SqlCommand の部分のパラメータとして Private Function CommonPara(CMD As SqlCommand) As SqlCommand     CMD.Parameters.Clear()     CMD.Parameters.Add(New SqlParameter(パラメータ1の記述)     CMD.Parameters.Add(New SqlParameter(パラメータ2の記述)     CMD.Parameters.Add(New SqlParameter(パラメータ3の記述)     CommonPara = CMD End Function

  • プロシージャまたは関数の引数が多すぎますのエラー

    お世話になります。 下記のコードを実行すると プロシージャまたは関数 spTest の引数が多すぎます どこが悪いのかご教示お願いいたします。 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i As Integer Dim conn As New SqlConnection(connstr) Dim cmd As New SqlCommand conn.Open() cmd.Connection = conn cmd.CommandText = "Delete Table2" cmd.CommandType = CommandType.Text Debug.WriteLine(cmd.ExecuteNonQuery()) For i = 1 To 100 spTest(cmd, i) Next conn.Close() End Sub sub spTest(ByRef cmd As SqlCommand, ByVal intID As Integer) Dim param As SqlParameter With cmd .CommandType = CommandType.StoredProcedure .CommandText = "spTest" param = .Parameters.Add(New _ SqlParameter("@ID", SqlDbType.Int)) param.Value = intID .ExecuteNonQuery()    ''''' ここで2回目からエラーが発生します End With End sub

  • ASP C#

    単純にデータベースから取得した物をフォームのTEXT_BOXに表示させたいのですがやり方がわかりません。 グリッドビューに結果をそのままバインドするのはわかるのですが。。。 select 品名 from 商品テーブル where ID = 3 など、結果が必ず1件のものです SqlConnection cn = new SqlConnection(@"Server=*****;Database=*****;User ID=***; Password=***;"); SqlCommand cmd = new SqlCommand("select title from mst_table where id = 1", cn); cn.Open(); このあと text_box.text = 結果; としたいんです。。。

  • ASP.NETで検索結果の上位50位を表示するには?

    ASP.NETで開発を初めて2,3日目です。      検索条件を入力して   結果を表示させると言う事を   やろうとしてます。   初期画面(検索条件の入力) ↓ (パラメタ渡し)   検索結果 検索条件を入れないと、全件表示になるので   表示が遅くなる、固まるなどの恐れがあるので   あらかじめ検索結果の件数を取得して   50件以上なら最初の50件だけ表示して   後はページングを言う事をやろうと思ってます。   どうゆう記述をすれば出来るでしょうか? 現在はSQL文の結果を全件表示になってます。 Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim MyConnString As String = "Data Source=Oracle_server;user ID=スキーマ;PASSWORD=パスワード;" Dim cn As New OracleConnection(MyConnString) cn.Open() DIM SQL文 SQL文 ="select * from 対象TABLE WHERE 項目名 = '" & 検索条件 & "' order by " & 検索条件 Dim cmd As New OracleCommand(SQL文, cn) Dim DR As OracleDataReader = cmd.ExecuteReader() DataGrid1.DataSource = DR DataGrid1.DataBind() End Sub 

  • ストアドプロシージャの実行について

    asp.net から sqlserver のストアドプロシージャを実行させる勉強をしています。 作成されているはずのストアドプロシージャを実行できずに困っています。 webformにテキストボックス、ボタン、データグリッドを貼り付け、ストアドプロシージャを作成し下記のプログラムを実行させるのですが上手くいきません。 (テキストボックスに任意で入力された数値のデータをボタンを押すと表示するものです) <エラー内容>→ ストアド プロシージャ 'proc1' が見つかりませんでした Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim cn As New SqlConnection Dim cmd As New SqlCommand cn.ConnectionString = "接続文字列" cmd.Connection = cn cmd.CommandText = "proc1" cmd.CommandType = System.Data.CommandType.StoredProcedure Dim p1 As SqlParameter = cmd.Parameters.Add("@param1", System.Data.SqlDbType.Int) p1.Value = TextBox1.Text cn.Open() Dim dr As SqlDataReader = cmd.ExecuteReader DataGrid2.DataSource = dr DataGrid2.DataBind() dr.Close() cn.Close() end sub ストアドproc1(場所:Northwind)の内容↓ CREATE procedure proc1 @param1 int as select * from products where categoryID=@param1 どなたか原因のわかる方がいれば、宜しくお願いします。

  • ASP.NET(VB.NET)でADO.NETを使ってAccessデータベースに接続する方法(長文)

    ASP.NETでADO.NETを使ってAccessデータベースに接続し、table2という名前のテーブルのidをテキストボックスに入力し、ボタンを押すとデータグリッドでそのidのデータが表示されるアプリケーションを作りました。が、自分で書いていても意味がわかりません。手元にあるのはASP.NETでSQLServerに接続する方法について解説してある書籍と、Accessに接続するもののWindowsアプリケーションからの接続(しかも表示させる物が違う)について解説してある書籍のみです。これらを組み合わせてなんとか表示させるまではできたのですが、全く意味がわかりません。どなたかご解説いただけないでしょうか? また、ASP.NET(VB.NET)でAccessデータベースと接続するアプリケーションについて触れてあるような書籍をご存知の方がいらっしゃいましたら、是非教えていただけないでしょうか?よろしくお願いいたします。 以下はボタンクリックされたときのイベントハンドラです。コードの先頭でImports System.Data.OleDbしてあります。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim dt As Integer Dim cn As New OleDbConnection("provider=microsoft.jet.oledb.4.0; Data Source=C:\nabe\採用\新人研修用\.NETコース\DB\kensyu2.mdb;") cn.Open() Dim cmd As New OleDbCommand("select * from table2 where id =?", cn) cmd.Parameters.Clear() cmd.Parameters.Add("param1", TextBox1.Text) dt = CType(cmd.ExecuteScalar(), Integer) Dim dr As OleDbDataReader = cmd.ExecuteReader() DataGrid1.DataSource = dr DataGrid1.DataBind() dr.Close() cn.Close() End Sub

専門家に質問してみよう