如何在asp.netcore中实现一个基础的身份认证

author author     2022-08-26     116

关键词:

注:本文提到的代码示例下载地址> How to achieve a basic authorization in 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中来实现一个基础的身份认证,既登陆功能。

 

前期准备:

1.推荐使用 VS 2015 Update3 作为你的IDE,下载地址:www.visualstudio.com

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

 

创建项目:

在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,"[email protected]")  
        }; 
 
        //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,"[email protected]")  
                };

                //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],即可配置位需要登陆验证的页面。

 

最后:如何运行这个Sample以及下载完整的代码请访问:How to achieve a basic authorization in ASP.NET Core

如何在 asp.net core 2.2 中实现 Cookie 基本身份验证和 jwt?

】如何在asp.netcore2.2中实现Cookie基本身份验证和jwt?【英文标题】:HowcaniimplementCookiebaseauthenticationandjwtinasp.netcore2.2?【发布时间】:2019-09-2907:52:12【问题描述】:我想在我的程序中同时使用基于cookie的身份验证和jwt,使用身份验... 查看详情

如何在 ASP.NET Core 2.2 中实现标识

】如何在ASP.NETCore2.2中实现标识【英文标题】:HowtoimplementIdentityinASP.NETCore2.2【发布时间】:2019-06-2511:45:21【问题描述】:在我的网站中,我想让管理员使用帐户登录以修改数据库。另外,我将来可能会添加一些角色和帐户。所... 查看详情

如何在 ASP.NET Core 中实现自定义模型验证?

】如何在ASP.NETCore中实现自定义模型验证?【英文标题】:ASP.NETCore-Createcustommodelvalidation【发布时间】:2016-07-1215:07:56【问题描述】:在以前版本的ASP.NETMVC中,向模型添加自定义验证的方法是实现IValidatableObject并实现您自己的Val... 查看详情

在 ASP.Net Core 中实现 ADO 连接

】在ASP.NetCore中实现ADO连接【英文标题】:ImplementADOconnectioninASP.NetCore【发布时间】:2018-04-0704:15:52【问题描述】:我需要从我的.NetCore项目中的数据库中获取一个存储过程。通常我通过这样做来运行这个存储过程:首选代码readon... 查看详情

检查用户是不是在 ASP.NET Core 中使用基于令牌的身份验证登录

】检查用户是不是在ASP.NETCore中使用基于令牌的身份验证登录【英文标题】:CheckifuserisloggedinwithTokenBasedAuthenticationinASP.NETCore检查用户是否在ASP.NETCore中使用基于令牌的身份验证登录【发布时间】:2017-05-1000:18:33【问题描述】:我... 查看详情

如何在 Asp.net mvc 或 Asp.net Core 中实现可搜索的 Dropdown?

】如何在Asp.netmvc或Asp.netCore中实现可搜索的Dropdown?【英文标题】:HowtoimplementDropdownwithsearchableinAsp.netmvcorAsp.netCore?【发布时间】:2021-12-0623:44:48【问题描述】:注意:在这里,在您执行任何其他操作之前,将这两个文件添加到... 查看详情

在 NSwag SwaggerUi 中实现 JwtBearer 身份验证

...Ui【发布时间】:2018-02-2410:39:43【问题描述】:在我的asp.netcore2.0解决方案中,我想添加AzureAD身份验证。使用VS2017中的AzureAD模板,您可以获得JWTBearer身份验证实施或OpenIdConnect实施。OpenI 查看详情

如何在 ASP.net Core 中实现 dataTables 服务器端分页/搜索/排序

】如何在ASP.netCore中实现dataTables服务器端分页/搜索/排序【英文标题】:HowtoimplementdataTablesServersideSidePaging/Searching/SortinginASP.netCore【发布时间】:2020-07-2013:38:08【问题描述】:我正在尝试从jQueryDatatable的服务器端执行搜索、排序... 查看详情

在 ASP.NET Core 2.1 Web API 中实现分页

】在ASP.NETCore2.1WebAPI中实现分页【英文标题】:ImplementPaginationinASP.NETCore2.1WebAPI【发布时间】:2019-02-1905:28:50【问题描述】:我搜索了,但并没有真正找到关于如何在ASP.NETWebAPICore2.1应用程序中实现分页逻辑的文章...我有以下[Route... 查看详情

如何在 Razor 页面中实现两个具有单独 BindProperties 的表单?

...8-07-0901:13:18【问题描述】:我正在使用带有Razor页面的ASP.NETCore2,并且我试图在一个页面上拥有两个具有不同属性(BindProperty)的表单。@page@modelmfa. 查看详情

如何在视图模型中实现 Firebase 电话身份验证?

】如何在视图模型中实现Firebase电话身份验证?【英文标题】:Howcanfirebasephoneauthbeimplementedinviewmodel?【发布时间】:2021-04-1004:42:00【问题描述】:我正在尝试使用Kotlin在视图模型中添加Firebase电话身份验证代码。问题是PhoneAuthProvi... 查看详情

如何在 Next.js 中实现身份验证

】如何在Next.js中实现身份验证【英文标题】:HowtoimplementauthenticationinNext.js【发布时间】:2018-09-2921:46:41【问题描述】:我是Next.js的新手,我正在努力使用jwt令牌的身份验证系统。我想知道使用身份验证系统存储jwt令牌和路由的... 查看详情

如何在 MVVM-C RxSwift 中实现 firebase 身份验证

】如何在MVVM-CRxSwift中实现firebase身份验证【英文标题】:HowtoimplementfirebaseauthintoMVVM-CRxSwift【发布时间】:2020-03-2512:27:07【问题描述】:我正在尝试实现一个MVVM-Crxswift应用程序。我的注册视图控制器有一个虚拟机,用户名和密码... 查看详情

Cookie 身份验证在 ASP.NET Core 应用程序中不起作用

】Cookie身份验证在ASP.NETCore应用程序中不起作用【英文标题】:CookieauthenticationisnotworkinginASP.NETCoreapplication【发布时间】:2020-06-2004:23:54【问题描述】:我正在尝试在.NETCore3.1中开发一个项目。我正在尝试在我的项目中实现基于coo... 查看详情

如何在 angularjs 应用程序中实现安全(!)身份验证系统?

】如何在angularjs应用程序中实现安全(!)身份验证系统?【英文标题】:HowtoachieveaSafe(!)authenticationsysteminanangularjsapp?【发布时间】:2013-01-2507:52:29【问题描述】:我是angularjs新手...我阅读了文档,并完成了教程;我自己也尝试... 查看详情

如何在 laravel 护照中实现多身份验证

】如何在laravel护照中实现多身份验证【英文标题】:howtoimplementmultiauthinlaravelpassport【发布时间】:2018-09-0120:51:57【问题描述】:我有两个用户admin/user我想验证这两个用户的api,它适用于一个用户,但不适用于管理员看看我尝试... 查看详情

如何在 Firebase 身份验证中实现多用户帐户登录和切换?

】如何在Firebase身份验证中实现多用户帐户登录和切换?【英文标题】:HowdoIwantimplementmultipleuseraccountloginandswitchinginFirebaseAuthentication?【发布时间】:2018-05-0713:08:55【问题描述】:在GmailAndroid应用中,您可以在用户帐户视图上滑... 查看详情

如何在 Spring Security 中实现基于 JWT 的身份验证和授权

】如何在SpringSecurity中实现基于JWT的身份验证和授权【英文标题】:HowtoimplementJWTbasedauthenticationandauthorizationinSpringSecurity【发布时间】:2018-08-2519:30:37【问题描述】:如何在SpringSecurity中实现基于JWT的认证和授权我正在尝试在我的... 查看详情