驗證是一道程序,其會將使用者提供的認證與作業系統、資料庫、應用程式或資源中儲存的認證進行比對。如果相符的話,使用者就能成功通過驗證,並可執行他們在授權程序期間取得授權的動作。授權則是判斷使用者是否有權存取資源的程式。
簡單來說
驗證 (Authentication)就是讓系統認得你是誰
授權 (Authorization)讓系統判斷你是否有權限
在ASP.NET Core中,身份驗證由驗證Middleware中使用的IAuthenticationService處理。驗證服務會使用已註冊的驗證處理常式來完成驗證相關的動作。 驗證相關動作的範例包括:
驗證設定的方式是由Startup.ConfigureServices
:
通過在使用services.AddAuthentication之後呼叫特定於方案的擴展方法(例如,例如AddJwtBearer或AddCookie)。 這些擴充方法會使用 AuthenticationBuilder AddScheme ,以適當的設定來註冊配置。
以下範例,在Startup.ConfigureServices
加入下列內容
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => Configuration.Bind("JwtSettings", options))
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => Configuration.Bind("CookieSettings", options));
透過AddAuthentication
註冊驗證的服務,並設定cookie及JWT的驗證配置。
如果使用多個配置,則授權策略(或授權屬性)可以指定它們要用來驗證用戶身份的驗證Scheme。
在上面的範例中,可以通過指定cookie身份驗證名稱來使用cookie身份驗證Scheme(默認情況下為CookieAuthenticationDefaults.AuthenticationScheme,但在呼叫AddCookie時可以提供其他名稱)。
透過呼叫UseAuthentication
擴充方法,將身份驗證的Middleware加入到Startup.Configure
當中。呼叫UseAuthentication
會註冊使用先前註冊的身份驗證設定的Middleware。在依賴於身份驗證用戶的任何Middleware之前,請呼叫UseAuthentication。
使用端點路由時,對UseAuthentication
的呼叫必須進行:
驗證完畢後,應該要搭配下列處理方式:
身份驗證方式有多種方式可以實現
以下使用Cookie驗證作為驗證成功後建立驗證資訊的範例
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, user.Email),
new Claim("FullName", user.FullName),
new Claim(ClaimTypes.Role, "Administrator"),
};
var claimsIdentity = new ClaimsIdentity(
claims, CookieAuthenticationDefaults.AuthenticationScheme);
var authProperties = new AuthenticationProperties
{
// 在此設定Cookies相關細節,如過期時間...等
};
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
authProperties);
ASP.NET Core 中的授權是由 AuthorizeAttribute 和其各種參數所控制。 將 [Authorize] 屬性套用至控制器、動作或頁面最簡單的形式, Razor會將該元件的存取限制為任何已驗證的使用者。
下列範例為ASP.NET Core的授權使用方式
在Controller中加入[Authorize]屬性,使Controller中每個Action都需要經過授權才能使用,其中,在Action上加入[AllowAnonymous]屬性,可以使個別Action允許未經驗證的使用者存取。
[Authorize]
public class AccountController : Controller
{
[AllowAnonymous]
public ActionResult Login()
{
}
public ActionResult Logout()
{
}
}
也可以只針對某個Action套用[Authorize]屬性
public class AccountController : Controller
{
public ActionResult Login()
{
}
[Authorize]
public ActionResult Logout()
{
}
}
授權也可針對每個使用者的角色,建立不同的權限。比如只有管理員有權限存取後台
[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
}
也可以對多個角色做設定(用,做區隔),並在Action上加以限制特定角色存取限制
[Authorize(Roles = "Administrator, Agent")]
public class AdministrationController : Controller
{
public ActionResult Get()
{
}
[Authorize(Roles = "Administrator")]
public ActionResult Update()
{
}
}
參考資料
Overview of ASP.NET Core Security