asp.net core 系列之用戶認證(authentication)

来源:https://www.cnblogs.com/Vincent-yuan/archive/2019/04/29/10788252.html
-Advertisement-
Play Games

ASP.NET Core 的 identity 是一種需要用戶登錄的會員系統,用戶可以創建一個登錄信息存儲在 Identity 的的賬號, 或者也可以使用第三方登錄,支持的第三方登錄包括:Facebook, Google, Microsoft Account, and Twitter. Identi ...


 

ASP.NET Core 的 identity 是一種需要用戶登錄的會員系統,用戶可以創建一個登錄信息存儲在 Identity 的的賬號,

或者也可以使用第三方登錄,支持的第三方登錄包括:Facebook, Google, Microsoft Account, and Twitter.

 

Identity 使用Sql Server 存儲用戶的姓名,密碼等數據,當然你也可以選擇其他的存儲工具進行存儲

 

這篇教程,將會講解如何使用Identity進行用戶的註冊,登錄,登出

 

1.創建一個帶認證(authentication)的web應用

  • 文件->新建->項目
  • 選擇ASP.NET Core Web 應用程式,命名WebApp1 ,點擊確定
  • 然後選擇web 應用程式,然後更改身份驗證
  • 選擇個人用戶賬號,確定

 

生成的項目會提供 ASP.NET Core Identity 功能,並且 Identity area 會暴露 下麵幾個 終端(endpoint):

  • /Identity/Account/Login
  • /Identity/Account/Logout
  • /Identity/Account/Manage

2.遷移

觀察生成的代碼,發現migration已經生成了,只需要更新到資料庫

在nuget 程式控制臺中,輸入:

Update-Database

 

直接在vs中的視圖,打開sql server 對象管理器,查看資料庫效果,確認資料庫更新成功:

 

 

 

3.配置 Identity 服務(Identity service)

服務被添加到了StartUp下的 ConfigureServices方法中

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>()
        .AddDefaultUI(UIFramework.Bootstrap4)
        .AddEntityFrameworkStores<ApplicationDbContext>();

  //這裡對Identity做一些配置 services.Configure
<IdentityOptions>(options => { // Password settings.密碼配置 options.Password.RequireDigit = true; options.Password.RequireLowercase = true; options.Password.RequireNonAlphanumeric = true; options.Password.RequireUppercase = true; options.Password.RequiredLength = 6; options.Password.RequiredUniqueChars = 1; // Lockout settings.鎖定設置 options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5); options.Lockout.MaxFailedAccessAttempts = 5; options.Lockout.AllowedForNewUsers = true; // User settings.用戶設置 options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+"; options.User.RequireUniqueEmail = false; }); services.ConfigureApplicationCookie(options => { // Cookie settings 緩存設置 options.Cookie.HttpOnly = true; options.ExpireTimeSpan = TimeSpan.FromMinutes(5); options.LoginPath = "/Identity/Account/Login"; options.AccessDeniedPath = "/Identity/Account/AccessDenied"; options.SlidingExpiration = true; }); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); }

 

 4.添加 註冊,登錄,登錄功能

  • 在解決方案的項目上,右鍵添加->新搭建基架的項目
  • 選擇標識,添加
  • 然後選擇你想添加的項

 

 

這裡的數據上下文中需要選中一個數據的,註意

 

之後,會生成相應的一些文件,包括註冊,登錄,登出

 

5.現在再看下,生成的代碼

註冊
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");
    if (ModelState.IsValid)
    {
        var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
        var result = await _userManager.CreateAsync(user, Input.Password); //創建賬戶
  
     if (result.Succeeded) { _logger.LogInformation("User created a new account with password."); var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); //生成郵箱驗證碼 var callbackUrl = Url.Page(  //生成驗證的回調地址 "/Account/ConfirmEmail", pageHandler: null, values: new { userId = user.Id, code = code }, protocol: Request.Scheme); await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",  //發送郵箱驗證郵件 $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>."); await _signInManager.SignInAsync(user, isPersistent: false);  //登錄 return LocalRedirect(returnUrl); } foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } // If we got this far, something failed, redisplay form return Page(); }

 

創建成功後,會直接顯示登錄狀態

 

登錄
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");

    if (ModelState.IsValid)
    {
        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, 
        // set lockoutOnFailure: true
        var result = await _signInManager.PasswordSignInAsync(Input.Email,  //密碼登錄
            Input.Password, Input.RememberMe, lockoutOnFailure: true);
        if (result.Succeeded)  //登錄成功
        {
            _logger.LogInformation("User logged in.");
            return LocalRedirect(returnUrl);
        }
        if (result.RequiresTwoFactor)  //兩步驗證
        {
            return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
        }
        if (result.IsLockedOut)  //鎖定
        {
            _logger.LogWarning("User account locked out.");
            return RedirectToPage("./Lockout");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return Page();
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

 

登出
public async Task<IActionResult> OnPost(string returnUrl = null)
        {
            await _signInManager.SignOutAsync();  //登出
            _logger.LogInformation("User logged out.");
            if (returnUrl != null)
            {
                return LocalRedirect(returnUrl);
            }
            else
            {
                return Page();
            }
        }

 

登錄頁面
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager

<ul class="navbar-nav">
    @if (SignInManager.IsSignedIn(User))
    {
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity"
               asp-page="/Account/Manage/Index"
               title="Manage">[email protected]!</a>
        </li>
        <li class="nav-item">
            <form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" 
                   asp-route-returnUrl="@Url.Page("/", new { area = "" })" 
                   method="post">
                <button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
            </form>
        </li>
    }
    else
    {
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
        </li>
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
        </li>
    }
</ul>

 

 6.驗證Identity

預設的web項目模板允許匿名訪問到主頁的,為了驗證Identity,給Privacy 頁面增加 [Authorize] 

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace WebApp1.Pages
{
  [Authorize]
public class PrivacyModel : PageModel { public void OnGet() { } } }

 

7.運行

測試註冊,登錄,登出功能

以及認證效果對比(即Privacy頁面增加Authrize前後):

加之前:不需要登錄,即可訪問Privacy頁面

加之後:需要登錄,才能訪問此頁面

 

這裡先記錄添加Identity操作流程,之後會具體講解一些功能點

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 準備工作 1.隨便準備一個項目工程,在本地用Pipenv創建一個虛擬環境並生成Pipfile和pipfile.lock文件,如下: 2.準備一臺伺服器,我這裡使用阿裡雲的ECS SSH連接上 Pycharm同步項目到伺服器 Tools Deployment Configuration 新增一個SFT ...
  • 1.pom.xml 2.UserConsumerDemoApplication.java 3.UserClient.java 4.UserFController.java ...
  • 基礎博弈論 博弈論,又稱對策論,是現代數學的一個分支,強調一個對策,看起來十分深奧,好像古代那些軍師的計謀。的確,博弈論是一門非常深奧的學科,在生活中也有不少運用,但作為信息學奧賽選手,我們沒有必要去專業的學習博弈論,只需要知道一些常見的博弈論以及它的結論和證明即可。 1、 巴什博弈 : 這是一個最 ...
  • 前言 Python虛擬環境是一個虛擬化,從電腦獨立開闢出來的環境。在這個虛擬環境中,我們可以pip安裝各個項目不同的依賴包,從全局中隔離出來,利於管理。 傳統的Python虛擬環境有virtualenv,使用pip freeze requirements.txt 導出依賴。現在又有了一個新神器 Pi ...
  • 1 路由 1.1app.url_map 查看所有路由 from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): """定義視圖函數""" print(app.url_map) return "he ...
  • 內容: 1、列表展示 2、輪播圖 3、其他 本次的內容也是在上一節的基礎上進行操作 我們就搞這個story模塊。 目錄: story.dart story主頁面 story_item.dart 構造列表頁面 裡面涉及到兩個公共庫 touch_callback.dart 觸摸回調 story_data ...
  • 一、引言 SpringBoot的一大優勢就是Starter,由於SpringBoot有很多開箱即用的Starter依賴,使得我們開發變得簡單,我們不需要過多的關註框架的配置。 在日常開發中,我們也會自定義一些Starter,特別是現在微服務框架,我們一個項目分成了多個單體項目,而這些單體項目中會引用 ...
  • # 多道程式系統 原理,缺點 #允許多個程式同時進入記憶體並運行。即同時把多個程式放入記憶體,並允許它們交替在CPU中運行,它們共用系統中的各種硬、軟體資源。當一道程式因I/O請求而暫停運行時,CPU便立即轉去運行另一道程式。 # 多道技術中的多道指的是多個程式,多道技術的實現是為瞭解決多個程式競爭或者 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...