-1
我想知道是否有一種標準方法只用一個密碼來保護ASP.Net Web應用程序?換句話說,不需要用戶名,所有客戶端都使用相同的密碼進行身份驗證。 還是有人有自己的解決方案?受所有客戶端的單一密碼保護的Web應用程序
我想知道是否有一種標準方法只用一個密碼來保護ASP.Net Web應用程序?換句話說,不需要用戶名,所有客戶端都使用相同的密碼進行身份驗證。 還是有人有自己的解決方案?受所有客戶端的單一密碼保護的Web應用程序
你可以簡單地使用Identity框架來實現這個建議。其實你不需要任何用戶名或密碼進行驗證。
[HttpPost]
public ActionResult Login(string password)
{
if (password=="MyVerySecretPassword")
{
var ident = new ClaimsIdentity(
new[] {
// adding following 2 claim just for supporting default antiforgery provider
new Claim(ClaimTypes.NameIdentifier, "JustAnuniqueName"),
new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string"),
new Claim(ClaimTypes.Name,"JustAnuniqueName"),
},
DefaultAuthenticationTypes.ApplicationCookie);
HttpContext.GetOwinContext().Authentication.SignIn(
new AuthenticationProperties { IsPersistent = false }, ident);
return RedirectToAction("MyAction"); // auth succeed
}
// invalid password
ModelState.AddModelError("", "invalid username or password");
return View();
}
但如果散列密碼,並檢查散列密碼,而不是上述簡單if
聲明它會好得多。爲了達到此目的,您可以使用PasswordHasher
類來散列和驗證密碼。
的第一個散列想要的密碼,並將其保存在首選的倉儲(DB,文件中的代碼或其他地方硬編碼):
string hashedPassword = new PasswordHasher().HashPassword("MyVerySecretPassword");
現在既然你已經散列之一。您可以使用VerifyHashedPassword()
方法進行驗證。
if(new PasswordHasher()
.VerifyHashedPassword("myHashedPassword",password)==PasswordVerificationResult.Success)
{
// the password is correct do whatever you want
}
此外,你可以看到我的simple working example,我做了演示它。
我在一個現有的應用程序中實現了它,它的工作原理!謝謝!有些事情我想知道。 * ClaimTypes名稱和NameIdentifier,這些必須對每個客戶端都是唯一的嗎? *有沒有辦法讓這個解決方案更安全? *有沒有一種方法來檢查客戶端是否已經有一個cookie,並在這種情況下讓用戶跳過登錄程序? Thx! – robbannn
'Name'主要用於顯示用戶名。 'NameIdentifier'被用作用戶名,所以它最好是唯一的。但在你的情況下,你可以爲所有的客戶端使用相同的用戶名,因爲實際上你的應用中有一個用戶。您也可以檢查User.Identity.IsAuthenticated屬性以查看當前用戶是否已通過身份驗證。 –
Thx!那麼有沒有辦法讓這更安全? – robbannn