小弟的問題GPT答非所問,因此想請教各位300w
環境:
.NET7 C# MVC (VisualStudio2022預設範本)
驗證方式為Windows驗證
情形如下
我發現在HomeController中可以引用User.Identity.Name來取得登入的使用者名稱
但是我要他在驗證後建立一個字串叫做Uuid,其字串的function要使用SqlConnection運行我的SQLcommand代入windows驗證後得到的User.Identity.Name,並且回傳我指定的字串,以供所有的MVC使用,好比我在HomeController或是View可以直接引用一個叫做User.Identity.Uuid這樣的字串
Program.cs
//儲存登入者資訊,方便在其他地方取出
builder.Services.AddHttpContextAccessor();
Controller.cs
List<Claim> claims = new List<Claim>()
{
new Claim(ClaimTypes.Name, [名稱]),
new Claim(ClaimTypes.NameIdentifier, [ID]),
//底下這個方式可以塞入自行定義的資料,想要幾個都可以,Key不要重複就好
new Claim([自己設定的Key],[Value])
};
//登入
ClaimsIdentity claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
await _contextAccessor.HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity));
//登出
await _contextAccessor.HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
上面是走Cookie的做法,Windows驗證應該大同小異,之後在View、Controller都可以取到資料,只要注入IHttpContextAccessor
就好
底下是比較常見的取法,需要比較特殊的就麻煩自己爬文了
//.cs
_contextAccessor.HttpContext.User.FindFirst([自定義的Key]).Value
_contextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
//.cshtml
//檢查是否有登入
User.Identity.IsAuthenticated
//取得Claim資料
User.Claims
.Where(x => x.Type == [自定義的Key])
.Select(y => y.Value)
.FirstOrDefault()