最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

浅谈如何在ASP.NET Core中实现一个基础的身份认证

来源:懂视网 责编:小采 时间:2020-11-27 22:36:14
文档

浅谈如何在ASP.NET Core中实现一个基础的身份认证

浅谈如何在ASP.NET Core中实现一个基础的身份认证:ASP.NET终于可以跨平台了,但是不是我们常用的ASP.NET, 而是叫一个ASP.NET Core的新平台,他可以跨Windows, Linux, OS X等平台来部署你的web应用程序,你可以理解为,这个框架就是ASP.NET的下一个版本,相对于传统ASP.NET程序,它还是有一些不同的地方
推荐度:
导读浅谈如何在ASP.NET Core中实现一个基础的身份认证:ASP.NET终于可以跨平台了,但是不是我们常用的ASP.NET, 而是叫一个ASP.NET Core的新平台,他可以跨Windows, Linux, OS X等平台来部署你的web应用程序,你可以理解为,这个框架就是ASP.NET的下一个版本,相对于传统ASP.NET程序,它还是有一些不同的地方

ASP.NET终于可以跨平台了,但是不是我们常用的ASP.NET, 而是叫一个ASP.NET Core的新平台,他可以跨Windows, Linux, OS X等平台来部署你的web应用程序,你可以理解为,这个框架就是ASP.NET的下一个版本,相对于传统ASP.NET程序,它还是有一些不同的地方的,比如很多类库在这两个平台之间是不通用的。

今天首先我们在ASP.NET Core中来实现一个基础的身份认证,既登陆功能。

前期准备:

1.推荐使用 VS 2015 Update3 作为你的IDE,下载地址://www.gxlcms.com/softjc/446184.html

2.你需要安装.NET Core的运行环境以及开发工具,这里提供VS版://www.gxlcms.com/softs/472362.html

创建项目:

在VS中新建项目,项目类型选择ASP.NET Core Web Application (.NET Core), 输入项目名称为TestBasicAuthor。

接下来选择 Web Application, 右侧身份认证选择:No Authentication

打开Startup.cs

在ConfigureServices方法中加入如下代码:

services.AddAuthorization(); 

在Configure方法中加入如下代码:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
 AuthenticationScheme = "Cookie", 
 LoginPath = new PathString("/Account/Login"), 
 AccessDeniedPath = new PathString("/Account/Forbidden"), 
 AutomaticAuthenticate = true, 
 AutomaticChallenge = true 
});

完整的代码应该是这样:

public void ConfigureServices(IServiceCollection services) 
{ 
 services.AddMvc(); 
 
 services.AddAuthorization(); 
} 
 
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
 app.UseCookieAuthentication(new CookieAuthenticationOptions 
 { 
 AuthenticationScheme = "Cookie", 
 LoginPath = new PathString("/Account/Login"), 
 AccessDeniedPath = new PathString("/Account/Forbidden"), 
 AutomaticAuthenticate = true, 
 AutomaticChallenge = true 
 }); 
 
 app.UseMvc(routes => 
 { 
 routes.MapRoute( 
 name: "default", 
 template: "{controller=Home}/{action=Index}/{id?}"); 
 }); 
}

你或许会发现贴进去的代码是报错的,这是因为还没有引入对应的包,进入报错的这一行,点击灯泡,加载对应的包就可以了。

在项目下创建一个文件夹命名为Model,并向里面添加一个类User.cs

代码应该是这样

public class User
{
 public string UserName { get; set; }
 public string Password { get; set; }
}

创建一个控制器,取名为:AccountController.cs

在类中贴入如下代码:

[HttpGet] 
public IActionResult Login() 
{ 
 return View(); 
} 
 
[HttpPost] 
public async Task<IActionResult> Login(User userFromFore) 
{ 
 var userFromStorage = TestUserStorage.UserList 
 .FirstOrDefault(m => m.UserName == userFromFore.UserName && m.Password == userFromFore.Password); 
 
 if (userFromStorage != null) 
 { 
 //you can add all of ClaimTypes in this collection 
 var claims = new List<Claim>() 
 { 
 new Claim(ClaimTypes.Name,userFromStorage.UserName) 
 //,new Claim(ClaimTypes.Email,"emailaccount@microsoft.com") 
 }; 
 
 //init the identity instances 
 var userPrincipal = new ClaimsPrincipal(new ClaimsIdentity(claims, "SuperSecureLogin")); 
 
 //signin 
 await HttpContext.Authentication.SignInAsync("Cookie", userPrincipal, new AuthenticationProperties 
 { 
 ExpiresUtc = DateTime.UtcNow.AddMinutes(20), 
 IsPersistent = false, 
 AllowRefresh = false 
 }); 
 
 return RedirectToAction("Index", "Home"); 
 } 
 else 
 { 
 ViewBag.ErrMsg = "UserName or Password is invalid"; 
 
 return View(); 
 } 
} 
 
public async Task<IActionResult> Logout() 
{ 
 await HttpContext.Authentication.SignOutAsync("Cookie"); 
 
 return RedirectToAction("Index", "Home"); 
}

相同的文件里让我们来添加一个模拟用户存储的类

//for simple, I'm not using the database to store the user data, just using a static class to replace it.
public static class TestUserStorage
{
 public static List<User> UserList { get; set; } = new List<User>() {
 new User { UserName = "User1",Password = "112233"}
 };
}

接下来修复好各种引用错误。

完整的代码应该是这样

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using TestBasicAuthor.Model;
using System.Security.Claims;
using Microsoft.AspNetCore.Http.Authentication;

// For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860

namespace TestBasicAuthor.Controllers
{
 public class AccountController : Controller
 {
 [HttpGet]
 public IActionResult Login()
 {
 return View();
 }

 [HttpPost]
 public async Task<IActionResult> Login(User userFromFore)
 {
 var userFromStorage = TestUserStorage.UserList
 .FirstOrDefault(m => m.UserName == userFromFore.UserName && m.Password == userFromFore.Password);

 if (userFromStorage != null)
 {
 //you can add all of ClaimTypes in this collection 
 var claims = new List<Claim>()
 {
 new Claim(ClaimTypes.Name,userFromStorage.UserName) 
 //,new Claim(ClaimTypes.Email,"emailaccount@microsoft.com") 
 };

 //init the identity instances 
 var userPrincipal = new ClaimsPrincipal(new ClaimsIdentity(claims, "SuperSecureLogin"));

 //signin 
 await HttpContext.Authentication.SignInAsync("Cookie", userPrincipal, new AuthenticationProperties
 {
 ExpiresUtc = DateTime.UtcNow.AddMinutes(20),
 IsPersistent = false,
 AllowRefresh = false
 });

 return RedirectToAction("Index", "Home");
 }
 else
 {
 ViewBag.ErrMsg = "UserName or Password is invalid";

 return View();
 }
 }

 public async Task<IActionResult> Logout()
 {
 await HttpContext.Authentication.SignOutAsync("Cookie");

 return RedirectToAction("Index", "Home");
 }
 }

 //for simple, I'm not using the database to store the user data, just using a static class to replace it.
 public static class TestUserStorage
 {
 public static List<User> UserList { get; set; } = new List<User>() {
 new User { UserName = "User1",Password = "112233"}
 };
 }
}

在Views文件夹中创建一个Account文件夹,在Account文件夹中创建一个名位index.cshtml的View文件。

贴入如下代码:

@model TestBasicAuthor.Model.User

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <title></title>
</head>
<body>
 @using (Html.BeginForm())
 {
 <table>
 <tr>
 <td></td>
 <td>@ViewBag.ErrMsg</td>
 </tr>
 <tr>
 <td>UserName</td>
 <td>@Html.TextBoxFor(m => m.UserName)</td>
 </tr>
 <tr>
 <td>Password</td>
 <td>@Html.PasswordFor(m => m.Password)</td>
 </tr>
 <tr>
 <td></td>
 <td><button>Login</button></td>
 </tr>
 </table>
 }
</body>
</html>

打开HomeController.cs

添加一个Action, AuthPage.

[Authorize]
[HttpGet]
public IActionResult AuthPage()
{
 return View();
}

在Views/Home下添加一个视图,名为AuthPage.cshtml

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <title></title>
</head>
<body>
 <h1>Auth page</h1>

 <p>if you are not authorized, you can't visit this page.</p>
</body>
</html>

到此,一个基础的身份认证就完成了,核心登陆方法如下:

await HttpContext.Authentication.SignInAsync("Cookie", userPrincipal, new AuthenticationProperties
{
 ExpiresUtc = DateTime.UtcNow.AddMinutes(20),
 IsPersistent = false,
 AllowRefresh = false
});

启用验证如下:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
 app.UseCookieAuthentication(new CookieAuthenticationOptions
 {
 AuthenticationScheme = "Cookie",
 LoginPath = new PathString("/Account/Login"),
 AccessDeniedPath = new PathString("/Account/Forbidden"),
 AutomaticAuthenticate = true,
 AutomaticChallenge = true
 });
}

在某个Controller或Action添加[Author],即可配置位需要登陆验证的页面。

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

浅谈如何在ASP.NET Core中实现一个基础的身份认证

浅谈如何在ASP.NET Core中实现一个基础的身份认证:ASP.NET终于可以跨平台了,但是不是我们常用的ASP.NET, 而是叫一个ASP.NET Core的新平台,他可以跨Windows, Linux, OS X等平台来部署你的web应用程序,你可以理解为,这个框架就是ASP.NET的下一个版本,相对于传统ASP.NET程序,它还是有一些不同的地方
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top