(22/30)大家一起學blazor:asp.net core identity(2)

(22/30)大家一起學blazor:asp.net core identity(2)

昨天做的驗證只針對`identity` 系統,沒有包含到我們的日誌

最后更新 2021/12/22 下午11:59
StrayaWorker
预计阅读 3 分钟
分类
Blazor
专题
一起學blazor系列
标签
.NET C# ASP.NET Core Blazor

昨天做的验证只针对Identity 系统,没有包含到我们的日志,如果在未登录状态下于地址栏输入https://localhost:5018/Blog,还是可以看到博客,让我们整合验证。

首先在Blog.razor外层加上<AuthorizeView>,这表示包在其中的内容呈现与否的条件为用户是否获得验证,接着在 Blog 内容外加上<Authorized>,顾名思义就是通过验证才能看到内容,另外新增一段未通过验证的<NotAuthorized>代码 。这边要记得加上Context="IdentityContext",否则会跟 Blog 的<EditForm>本身的context产生冲突。

再去App.razor<CascadingAuthenticationState>将原本的<Router>包裹,告诉Blazor 所有Component 都必须经过验证。

然后是NavMenu.razor<Authorized>Component 加上注销链接,登录链接则移到<NotAuthorized>,icon 也改一下。

這時候要重新啟動系統,驗證機制才會生效,可以看到確實擋住了未驗證訪問。

在登录前,先打开Dev ToolApplication 页签去看Cookies,目前只有一个Cookie

登录后看到新的Cookie,这就是我们的Authentication Cookie

接着来试试看注销,点击左边的Logout,并没有如想像中注销,而是来到一个 Log out 页面,右上角还是登录状态,Authentication Cookie 也还在。

我们去看Logout.cshtml.cs,里面有OnGet()(站长注:.NET 6 Blazor server 中没有该方法,请对比)跟OnPost()分别对应HttpGetHttpPost,我们从链接点过来的做法是HttpGet,但OnGet()这里什么事都没做,OnPost()则调用ASP.NET Core Identity API 将用户注销。

原文原圖:多了一個 onget()方法

站長.net 6 項目截圖:和上面對比,少了一個 onget()方法

Logout.cshtml也找到了一个<form>元素,asp-page这些asp-开头的代码是ASP.NET CoreTag Helper (标签协助代码),类似Angular*ngFor,这边先略过不提,我们看到这里用了method="post",还有个<button type="submit">,对应了刚才的OnPost()

通常不会有用户点了注销后还要再点一次注销,所以我们这边改动一下,先给<form>加上id="LogoutFormInLogout",再加上一段<script>,这里用到IIFE(Immediately Invoked Functions Expressions),意即不需要调用就会执行的函式,一旦用户进入这页面就会将<form>提交,如此一来,只要点击NavMenu左边的 Logout 链接,就可以顺利注销了。

如果不想要加上id="LogoutFormInLogout"这么长的 id,也可以用id="logoutForm"就好,根目录下的Pages/Shared/_LoginPartial.cshtml里面有个注销的<form>已经定义了id="logoutForm"这个 id。

不过现在注销后还停留在Log out页面似乎没有意义,所以将OnPost()的 else 区块改成return LocalRedirect("~/Blog");,这样注销后就会回到未验证的Blog 页面。

這樣一來就完成了單一項目的登錄驗證機制,而且各種功能、頁面一應俱全,如果只是小型項目的話可以這麼做,明天就來說明這些 asp.net core 的驗證原理。

引用:

  1. 立即函式 IIFE
  2. Blazor cookie authentication Logout page

註:本文代碼通過 .net 6 + visual studio 2022 重構,可點擊原文連結與重構後代碼比較學習,謝謝閱讀,支持原作者

Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2021/12/25

(29/30)大家一起學blazor:blazor單元測試

開發一個系統最無聊的過程大概就是解決bug了,尤其是那種嘗試對null 對象取值的錯誤(`object reference not set to an instance of an object.`),這應該是大部分人剛踏入編程領域最常碰到的問題,為了從枯燥的解決bug過程解脫,這篇就來居間`單元測試`。

继续阅读
同分类 / 同标签 2021/12/25

(28/30)大家一起學blazor:policy-based authorization

之前有說到`asp.net core identity` 使用的是基於`claim` 的驗證,其實`asp.net core identity` 有不同類型的授權方式,最簡單的`登錄授權`、`角色授權`、`claim 授權`,但上述幾種都是以一種方式實現:原則授權(`policy-based authorization`)。

继续阅读