PDA

View Full Version : سوال: دسترسی کاربران به صفحات



r4hgozar
سه شنبه 24 تیر 1393, 15:04 عصر
سلام دوستان و اساتید.
من می خوام بدونم چطوری باید سطح دسترسی برای کاربران رو تایین کنم.
من یک صفحه ساختم بصورت زیر
البته در area
2 تا کنترل دارم و 3 تا model که کدهاش رو پایین می زارم

public class AdminPostsController : Controller
{
private DataBaseContext db = new DataBaseContext();


// GET: /Admin/AdminPosts/
public ActionResult Index()
{
return View(db.Posts.ToList());
}


// GET: /Admin/AdminPosts/Details/5
public ActionResult Details(Guid? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Post post = db.Posts.Find(id);
if (post == null)
{
return HttpNotFound();
}
return View(post);
}


// GET: /Admin/AdminPosts/Create
public ActionResult Create()
{
return View();
}


// POST: /Admin/AdminPosts/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include="ID,Title,Description")] Post post)
{
if (ModelState.IsValid)
{
post.ID = Guid.NewGuid();
db.Posts.Add(post);
db.SaveChanges();
return RedirectToAction("Index");
}


return View(post);
}


// GET: /Admin/AdminPosts/Edit/5
public ActionResult Edit(Guid? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Post post = db.Posts.Find(id);
if (post == null)
{
return HttpNotFound();
}
return View(post);
}


// POST: /Admin/AdminPosts/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include="ID,Title,Description")] Post post)
{
if (ModelState.IsValid)
{
db.Entry(post).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(post);
}


// GET: /Admin/AdminPosts/Delete/5
public ActionResult Delete(Guid? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Post post = db.Posts.Find(id);
if (post == null)
{
return HttpNotFound();
}
return View(post);
}


// POST: /Admin/AdminPosts/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(Guid id)
{
Post post = db.Posts.Find(id);
db.Posts.Remove(post);
db.SaveChanges();
return RedirectToAction("Index");
}


protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
}



این کنترل مربوط به پست گذاشتن توسط ادمین بود.
و این که پایین هست مربوط به ثبت نام یوزر ها

public class LoginController : Controller
{
private DataBaseContext db = new DataBaseContext();


// GET: /Admin/Login/
public ActionResult Index()
{
return View(db.Userses.ToList());
}


// GET: /Admin/Login/Details/5
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Users users = db.Userses.Find(id);
if (users == null)
{
return HttpNotFound();
}
return View(users);
}


// GET: /Admin/Login/Create
public ActionResult Create()
{
return View();
}


// POST: /Admin/Login/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include="ID,Name,LastName,NickName")] Users users)
{
if (ModelState.IsValid)
{
db.Userses.Add(users);
db.SaveChanges();
return RedirectToAction("Index");
}


return View(users);
}


// GET: /Admin/Login/Edit/5
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Users users = db.Userses.Find(id);
if (users == null)
{
return HttpNotFound();
}
return View(users);
}


// POST: /Admin/Login/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include="ID,Name,LastName,NickName")] Users users)
{
if (ModelState.IsValid)
{
db.Entry(users).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(users);
}


// GET: /Admin/Login/Delete/5
public ActionResult Delete(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Users users = db.Userses.Find(id);
if (users == null)
{
return HttpNotFound();
}
return View(users);
}


// POST: /Admin/Login/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
Users users = db.Userses.Find(id);
db.Userses.Remove(users);
db.SaveChanges();
return RedirectToAction("Index");
}


protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
}


و این هم مدل هام که بر اساس اونها کنترل و ویو رو ساختم

public class Users
{
public Users()
{

}


public int ID { get; set; }
public string Name { get; set; }
public string LastName { get; set; }
public string NickName { get; set; }
}



public class Post
{
public Post()
{
ID = new Guid();;
}
[Key]
[Required]
public System.Guid ID { get; set; }
[MaxLength(100)]
[Required]
public string Title { get; set; }
public String Description { get; set; }

}




public class DataBaseContext : DbContext
{
public DataBaseContext()
{


}


static DataBaseContext()
{
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DataBaseContext>());
}


public DbSet<Post> Posts { get; set; }
public DbSet<Users> Userses { get; set; }
}





من نمی دونم اصلا در مرحله بعد چطوری باید از autorize ها استفاده کنم.
خواها اگه کسی مثال خیلی ساده داره ویا می تونه همینجا بگه مرحله بعد باید چی کار کنم ممنون میشم.
خیلی گشتم و خوندم اما مطالب ساده نیستن و خیلی سنگین و بدون ترتیب مطرح میشن.


ممنون از همه

sunn789
سه شنبه 24 تیر 1393, 15:40 عصر
سلام
تا اونجا که منمیدونم و توی پروژه هام ازش استفاده میکنم دو نوع دسترسی داریم
یکی همون استفاده از Web.config که توی هر پوشه میتونید بگذارید و یا تک تک صفحات رو توش تعریف کنی
اما اونچه الان توی Mvc Code First میتونی کار کنی اینه که [Authorize] رو بر روی کل کنترل و یا اکشنهای خاص اعمال کنی ، به این نحو که فقط فبا از کل کنترل و یا اکشن [Authorize] رو بگذاری و تا کاربر تایید نشود امکان اجرا این اکشن نخواهد بود
و برای ورود هم از صفحه ورودی که خود ام وی سی میسازه استفاده کن

r4hgozar
سه شنبه 24 تیر 1393, 17:58 عصر
سلام.
ممنون این رو می دونم.
اما می خواستم بدونم چطوری باید همین authorize سفارسی تایین کنم.
خواهشا یکی جواب بده

sunn789
چهارشنبه 25 تیر 1393, 21:44 عصر
[Authorize(Roles="نقشی که میخواهید دسترسی داشته باشد",Users="کاربری که میخواهید دسترسی داشته باشد ")]
public class AdminPostsController : Controller
{
private DataBaseContext db = new DataBaseContext();


// GET: /Admin/AdminPosts/
public ActionResult Index()
{
return View(db.Posts.ToList());
}


// GET: /Admin/AdminPosts/Details/5
public ActionResult Details(Guid? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Post post = db.Posts.Find(id);
if (post == null)
{
return HttpNotFound();
}
return View(post);
}


// GET: /Admin/AdminPosts/Create
public ActionResult Create()
{
return View();
}


// POST: /Admin/AdminPosts/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see <a href="http://go.microsoft.com/fwlink/?LinkId=317598" target="_blank">http://go.microsoft.com/fwlink/?LinkId=317598</a>.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ID,Title,Description")] Post post)
{
if (ModelState.IsValid)
{
post.ID = Guid.NewGuid();
db.Posts.Add(post);
db.SaveChanges();
return RedirectToAction("Index");
}


return View(post);
}


// GET: /Admin/AdminPosts/Edit/5
public ActionResult Edit(Guid? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Post post = db.Posts.Find(id);
if (post == null)
{
return HttpNotFound();
}
return View(post);
}


// POST: /Admin/AdminPosts/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see <a href="http://go.microsoft.com/fwlink/?LinkId=317598" target="_blank">http://go.microsoft.com/fwlink/?LinkId=317598</a>.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "ID,Title,Description")] Post post)
{
if (ModelState.IsValid)
{
db.Entry(post).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(post);
}


// GET: /Admin/AdminPosts/Delete/5
public ActionResult Delete(Guid? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Post post = db.Posts.Find(id);
if (post == null)
{
return HttpNotFound();
}
return View(post);
}


// POST: /Admin/AdminPosts/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(Guid id)
{
Post post = db.Posts.Find(id);
db.Posts.Remove(post);
db.SaveChanges();
return RedirectToAction("Index");
}


protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
}
اون authorize که بالای کلاس هست رو میتونی برداری و به هر کدوم از کلاسها خواستین هم اعمال کنی
اگر درست متوجه شده باشم

sara_mp
شنبه 14 شهریور 1394, 14:05 عصر
اين [Authorize(Roles="نقشی که میخواهید دسترسی داشته باشد",Users="کاربری که میخواهید دسترسی داشته باشد ")] مربوط به زماني هست كه از خود membership .net استفاده كنيم اكه خودمون اين سطح دسترسي ها رو تو ديتابيس ذخيره كنيم چي؟

sunn789
شنبه 14 شهریور 1394, 18:55 عصر
راه حلهایی ایجاد نقشها متفاوته.، ساده ترین اینه که بعد اجرایی اولین بار پروژه به عنوان یک کاربر ثبت نام کنید و بعد از آن هر تعداد نقش رو که میخواهی در همان قسمت تعریف کنی، و به تطابق همان نقشها در قسمت role نام نقش و یا با استفاده از user نام کاربری که دسترسی به اکشن و یا کلاس داره رو مشخص کنید، در ضمن این membership. که گفتیم مربوط به asp.net former هست، البته میشود در mvc. هم استفاده کرد اما استفاده از این روش (identity) پیشنهاد شده است