一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - 基于mvc5+ef6+Bootstrap框架實現身份驗證和權限管理

基于mvc5+ef6+Bootstrap框架實現身份驗證和權限管理

2021-11-29 14:42豐叔叔 C#

最近剛做完一個項目,項目架構師使用mvc5+ef6+Bootstrap,用的是vs2015,數據庫是sql server2014。下面小編把mvc5+ef6+Bootstrap項目心得之身份驗證和權限管理模塊的實現思路分享給大家,需要的朋友可以參考下

近和朋友完成了一個大單子架構是ef="/article/51254.html">mvc5+ef6+Bootstrap,用的是vs2015,數據庫是sql server2014。朋友做的架構,項目完成后覺得很多值得我學習,在這里總結下一些心得。

創建項目一開始刪掉App_Start目錄下的IdentityConfig.cs和Startup.Auth.cs文件;清空Modle文件夾,Controller文件夾和相應的View; 刪除目錄下的ApplicationInsights.config文件和Startup.cs文件

修改web.config文件(添加<add key="owin:AutomaticAppStartup" value="false"/>不使用Startup.cs文件來啟動項目)

?
1
2
3
4
5
6
7
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="owin:AutomaticAppStartup" value="false"/> <!--去掉創建項目初的Startup.cs文件的設置-->
</appSettings>

(不用他們是因為自帶的這些內容太冗余)

去掉冗余內容正式開始,首先介紹數據庫這一塊,數據庫我們是配置的可以手動生成和修改的

1.在項目目錄想創建Migrations文件夾,里面添加Configuration.cs文件

?
1
2
3
4
5
6
7
8
9
10
11
12
internal sealed class Configuration : DbMigrationsConfiguration<AccountContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
ContextKey = "UserProject.DAL.AccountContext";
}
protected override void Seed(AccountContext context)
{
//base.Seed(context);
}
}

在Modle文件夾下添加AccountContext.cs文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class AccountContext:DbContext
{
public AccountContext():base("AccountContext") {
}
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
<connectionStrings>
<add name="AccountContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\UserProject.mdf;Initial Catalog=UserProject;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>

然后 使用vs2015里面的工具-NuGet包管理器-程序包管理控制平臺

輸入add-migration Initial 按回車,在輸入update-database按回車。在App_Data文件夾下就會看到AccountContext數據庫了。

2.在Modle文件夾下添加User.css文件

?
1
2
3
4
5
6
7
8
9
public class User
{
public int ID { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public Role Role { get; set; }
}
public enum Role//角色枚舉
{ 管理員 = 0, 員工 = 1, 經理 = 2, 總經理 = 3, 董事長 = 4 }

在ViewModle文件夾中添加Account.cs文件

?
1
2
3
4
5
6
7
8
public class Account
{
[Required]
public string Name { get; set; }
[Required]
public string Password { get; set; }
public string RePassword { get; set; }
}

這里推薦創建BaseController之后的Controller就繼承它來使用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class BaseController : Controller
{
public string UserName => User.Identity.Name;
public AccountContext db = new AccountContext();
private User _userInfo = null;
public User CurrentUserInfo
{
get
{
if (_userInfo == null)
{
var user = db.Users.SingleOrDefault(u => u.UserName == UserName);//此處為了不每次訪問用戶表可以做一個靜態類,里面存放用戶表信息.
_userInfo = user == null ? null : new User()
{
ID = user.ID,
UserName = user.UserName,
Role = user.Role
};
}
return _userInfo;
}
}
    //驗證角色:獲取Action的CustomAttributes,過濾角色
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
var authRoleAtt = filterContext.ActionDescriptor.GetCustomAttributes(false).SingleOrDefault(att => att is AuthorizeRoleAttribute) as AuthorizeRoleAttribute;
if (authRoleAtt == null && CurrentUserInfo != null)
return;
if (!authRoleAtt.Roles.Contains(CurrentUserInfo.Role))
{
filterContext.Result = View("NoPermission", "_Layout", "您沒有權限訪問此功能!");
}
}
//這里是記log用
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
var msg = $"用戶: {CurrentUserInfo?.UserName}, 鏈接: {Request.Url}";
if (Request.HttpMethod == "POST")
msg += $", 數據: {HttpUtility.UrlDecode(Request.Form.ToString())}";
//Log.Debug(msg);
}
}

AdminController繼承BaseController

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Authorize]
public ActionResult Index()
{
return View(db.Users.ToList());
}
[Authorize, AuthorizeRole(Role.管理員)]
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
User user = db.Users.Find(id);
if (user == null)
{
return HttpNotFound();
}
return View(user);
}

登錄頁面:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@model UserProject.ViewModels.Account
@{
ViewBag.Title = "Login";
}
@using (Html.BeginForm("Login", "Admin",FormMethod.Post, new { @class = "form-horizontal", role = "form" })) {
@Html.AntiForgeryToken()
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(m => m.Name, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Name, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.Password, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="登錄" class="btn btn-primary" />
</div>
</div>
}

登錄的Action:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[AllowAnonymous]
public ActionResult Login()
{
return View();
}
[HttpPost, AllowAnonymous]
public ActionResult Login(Account model)
{
if (ModelState.IsValid)
{
var user = db.Users.SingleOrDefault(t => t.UserName == model.Name && t.Password == model.Password);
if (user != null)
{
FormsAuthentication.SetAuthCookie(model.Name, false);//將用戶名放入Cookie中
return RedirectToAction("Index");
}
else
{
ModelState.AddModelError("Name", "用戶名不存在!");
}
}
return View(model);
}
public ActionResult LogOff()
{
FormsAuthentication.SignOut();
return RedirectToAction("Login");
}

按照以上方式 訪問Details這個Action的時候必須是管理員角色。

以上所述是小編給大家介紹的基于mvc5+ef6+Bootstrap框架實現身份驗證和權限管理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:http://www.cnblogs.com/shootingstar/p/5629668.html

延伸 · 閱讀

精彩推薦
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
主站蜘蛛池模板: 日韩乱淫| 日韩久久影院 | 麻豆性视频 | 精品99在线观看 | 国产免费色视频 | 国产亚洲福利精品一区 | 毛片视频网站在线观看 | 操老逼视频 | 精品国产三级av在线 | 国产片自拍| 欧美美女被爆操 | 99热精品69堂国产 | 日本手机在线视频 | 久久精品国产免费 | a级黄色视屏 | 亚欧精品在线观看 | 隔壁老王国产精品福利 | 久久99r66热这里有精品 | fuqer日本老师 | 欧美美女一级片 | 白丝美女用胸伺候主人 | 美女扒开肌肌让男人桶 | 久久91精品国产91 | 九九九国产在线 | 果冻传媒天美传媒在线小视频播放 | 亚洲欧美久久婷婷爱综合一区天堂 | 美女被上漫画 | 精品久久久久免费极品大片 | 91碰 | 色婷婷综合久久久中文字幕 | 日本人添下面的全过程 | 玩乳h文奶水和尚 | 美女脱衣有肉 | 国产在视频线精品视频 | 日本精品久久久久久久久免费 | 牛牛色婷婷在线视频播放 | 青青热久免费精品视频精品 | 色戒完整版2小时38分钟 | 男女做受快插大片 | yellow视频在线观看免费 | 蜜桃破解版免费看nba |