2012-04-20 4 views
0

、許可されていないユーザーがそのコントローラーにアクセスするようにしてください。
iが私はしませんので、私のいくつかのコントローラは、それらのすべて<br> を許可されて作られた<br> いる私はasp.netのmvc3でサイトを構築しています問題を抱えている

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace Com.health.Controllers 
{ 
    [Authorize] 
    public class MyfirstController : Controller 
    { 
     public ActionResult Index() 
     { 
      return View(); 
     }   
     public ActionResult seeyourDetails(int id) 
     { 
      return View(); 
     } 
    } 
} 

今どのユーザ自身のアカウント情報を伝えるseeyourDetails私たちの方法を想定しましょう、しかし、問題はその時に、このよう際にユーザアクセスこの方法では、次のようコントローラとその中の2つの方法があるとしましょうURLは10は人物が自分のサイトにログインし、彼はこのURLにアクセスして、手動で10を追加したり、URL内の他の数が私のコントローラが表示された場合、私は彼に彼の詳細を示しているが、私は何をすべきことで、現在のユーザーIDですhttp://www.exampple.com/Myfirst/seeyourDetails/10、ありますそのユーザーに関するすべての詳細。

注:私は1つの場所または2つの場所でこれを行うことができますしかし、私は一つの場所に実装し、それは私のアプリケーション全体に影響し、いくつかのソリューションが必要です。おかげ

答えて

2

を知っておく必要があるとき、私が見る唯一の方法は、クエリ文字列からユーザIDこれは、パッチ適用、物事ソリューションの詳細です。ログインしたユーザIDと同じであるかどうかを確認することです適切な方法は、アプリの仕組みを変更することです。このような何かが、あなたはまだそれを少し変更する必要があります。

[AttributeUsage(AttributeTargets.Method|AttributeTargets.Class, AllowMultiple = false)] 
public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 
     var ctx = filterContext.HttpContext; 
     var name = ctx.User.Identity.Name; 

     //get user id from db where username= name 

     var urlId = Int32.Parse(ctx.Request.Params["id"]); 
     if (userId!=urlId) 
      filterContext.Result = new HttpUnauthorizedResult(); 
    } 
} 
0

あなたはパラメータをクエリ文字列からユーザーIDを取得するために持っていけません。認証されたユーザー情報のセッションに設定する必要があります。そして、セッションからそれを得るあなたが認証されたユーザー

+0

この場合、私はアプリで多くのことを変更する必要がありますが、現在の状況に対する解決策はありますか? – Ahsan

+0

あなたはサーバー側で認証されたユーザーを知る必要があります。認証されたユーザ名でdbからユーザ情報を取得できます。 – Yorgo

1

最初Authorizeは非常に強力かつ粒状です。クラスレベルとメソッドレベルで使用できます。また、どのロールにアクセスできるかを設定することもできます。あなたは基本的に認証されたすべてのユーザーを言っている

[Authorize] 
public class MyFirstController : Controller 

、あなたもあなたのより細かい制御を与える

[Authorize(Roles="Administrator")] 
public class MyFirstController : Controller 

を使用することができます。ここでは、管理者の役割でのみユーザーを言っているこれらのコンテンツにアクセスすることを許可されています。 今のところSeeYourDetailsあなたは本当にユーザーIDを送信してはいけません。

var current = Membership.GetUser(); 

ですから、すべてのコードは次のようなものになります::

using System; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Security; 
using System.Collections.Generic; 


namespace TestArea.Controllers 
{ 
    [Authorize] 
    public class MyFirstController : Controller 
    { 

     public ActionResult Index() 
     { 
      return View(); 
     } 

     public ActionResult SeeYourDetails() 
     { 
      //get the currently logged in user 
      var current = Membership.GetUser(); 
      //you can always do something else here 
      return View(current); 
     } 


    } 

} の詳細情報を、ユーザーが現在ログインしている場合、あなたはこのような彼/彼女の詳細にアクセスすることができます属性を承認するhttp://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx

最後に、少なくとも重要ではありません。 C#でプログラムするつもりなら、表記法を尊重する必要があります:-) これは役に立ちます。

0

あなたが言っていることは、データ承認であり、ユーザはサイトにログインした後で彼の詳細しか見ることができません。

認証フィルターで@MikeSWのようにカスタムAuthorizeフィルターを作成できます。ログインしたユーザーのIDがクエリ文字列で渡されたIDと同じで、ユーザーIDをセッションに格納する必要がある場合。

アクションレベルまたはコントローラレベルまたはグローバルレベルでもフィルタを適用できます。

関連する問題