獨立使用 serilog in Asp.net Core 2.0

一般而言,我們都使用:將 Serilog 加入到預設的 LOG 中:

loggerFactory.AddSerilog();

但這裡會有一點點麻煩的是 Asp.net Core內建的 Ilogger 會自動記錄系統執行狀況,造成 log 訊息過多,反而不方便分析。

如果只想要將明確指定的LOG記錄在檔案內,不是透過 information 等設定,也不想要內建的複雜訊息,可以透過分開設定 Serilog 透過 Rolling File 記錄我們想要的訊息:

首先,在 Program.cs 中,設定 ConfigureAppConfiguration如下(也可以直接在 Startup.cs 中的 constructor 中設定,但因為這些是屬於基本設定,我們不希望讓 startup 複雜化,因此在這裡就直接設定好)

Log.Logger = new LoggerConfiguration()
    .WriteTo.RollingFile(@"logs\log-{Date}.txt",
        outputTemplate: "{Timestamp:HH:mm:ss} [{SourceContext}][{Level}]{Message}{NewLine}")
    .CreateLogger();

這裡重點在於 Log.Logger 透過用 Serilog 的 Configuration 建立的 Logger 參數,我們設定了許多的訊息表達方式。

其次,在 Startup.cs 中,利用 Singleton 將此 Log.Logger 利用 dependency Injection 提供給需要使用的 class:
services.AddSingleton(Log.Logger);

這裡必須要指定 Serilog.ILogger 否則會跟內建的 ILogger interface 混淆。

同樣的,要使用的 class 也要透過 injection 使用:

public class ContactModel : PageModel
{
    public string Message { get; set; }
 
    private readonly Serilog.ILogger _logger;
 
    public ContactModel(Serilog.ILogger logger)
    {
        _logger = logger.ForContext<ContactModel>();
    }
}

其中,指定 ForContext 會搭配 {SourceContext} 顯示在 log 檔案中。

如果要將內建的 log 訊息寫入到 Serilog 中(或者簡單說用 serilog 取代內建的 Extension.ILogger ),可以用:
1. 引用 nuget package: Serilog.Extensions.Logging
2. 在 Startup.ConfigureServices 中,使用 AddSerilog 方式達成:

Asp.net Core 2.0 用既有的使用者帳密作為驗證機制

主要使用情境為採用企業內部其他的既有網站授權機制(例如簡單的 User Table),裡面包含使用者的資料,往往同仁會希望採用同樣的帳號與密碼就可以登入,而不要再產生新的帳密。在這種情境下,無法使用 Asp.Net 推薦的 Aspnet.Identity 的驗證方式,因為要整個移轉有資料庫方面的問題。

但 Asp.net Core 提供 Cookie Authentication 可以存取既有的資料庫做為驗證的來源。參閱官方說明:Using Cookie Authentication without ASP.NET Core Identity官方設定範例

 

實做參考:Cookie Authentication In ASP.net Core 2.0  主要修改:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication("CookieAuthenticationScheme")
        .AddCookie("CookieAuthenticationScheme", options =>
        {
            options.AccessDeniedPath = "/Account/Forbidden/";
            options.LoginPath = "/Account/Login/";
            options.ExpireTimeSpan = TimeSpan.FromHours(2);
        });
 
    services.AddMvc();
}

使用 [Authorize] attribute 時候,必須要指定要使用的認證方式,否則不會自動導入到 Login Page

在 Sign In 的時候,可以直接建立一個虛假的 Claim,只需要給名字即可:

private async Task SignInAsync(User user)
{
    var claims = new List<Claim> { new Claim(ClaimTypes.Name, user.Name) };
    var userIdentity = new ClaimsIdentity(claims, "login");
    ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity);
 
    await HttpContext.SignInAsync("CookieAuthenticationScheme", principal);
}

請注意這裡也要使用同樣的字串名稱。