iT邦幫忙

0

C# .NET7.0 MVC 全域字串

  • 分享至 

  • xImage

小弟的問題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這樣的字串

看更多先前的討論...收起先前的討論...
柯柯 iT邦新手 3 級 ‧ 2023-04-18 16:36:03 檢舉
Dependency Injection(DI,依賴注入)?
應該用這個就可以了 雖然我NET 還沒很熟 但看起來應該用DI就可以處理了
SqlController處理好資料
HomeController 注入SqlController 再取用SqlController 物件內的屬性
有個問題在我要使用登入後的名稱
所以我找不到驗證過後會執行的第一個程式碼
以及使用User.Identity.Name的地方
在其中要使用User.Identity.Name得要是Controller的型態並且引入
private readonly IWebHostEnvironment hostingEnvironment;
public HomeController(IWebHostEnvironment _hostingEnvironment) => hostingEnvironment = _hostingEnvironment;
才可以使用
柯柯 iT邦新手 3 級 ‧ 2023-04-18 17:27:25 檢舉
你貼程式碼吧
流程應該是 (登入 => 驗證 => 回傳SQL資料跟字串) LoginController
=> 其他Controller取用這個字串
其他的有需要用到Controller 去DI LoginController 取用 UUID即可

1 為什麼會找不到驗證後所建立的字串跟使用的地方
2 需要的Controller DI就好 其他不需要用的不要DI 就好
3 你寫那那段就是 把IWebHostEnvironment DI到HomeController了 後同第2點

如果有錯誤請其他大大幫忙更正
kw6732 iT邦研究生 5 級 ‧ 2023-04-19 10:05:14 檢舉
有需要引用時須使用using才可行,vs也會提醒你,且除非在同一個控制項內,在MVC應該是用傳入的。
* 共用的變數 可以用session傳遞即可。
另外,你有沒有想過,會不會是方向不對,改用Session的方式來登入來取代 "Windows帳號" 驗證,才會比較可行呢?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

3
jack8900
iT邦新手 2 級 ‧ 2023-04-19 15:59:22

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()

我要發表回答

立即登入回答