ASP.NET MVC 5アプリケーションを開発しています。既存のDBがあり、そこからADO.NET Entity Data Modelを作成しました。そのDBに「username」列と「password」列を含むテーブルがあり、それらを使用してWebappに認証と承認を実装します。顧客の要件により、他のデータベース、テーブル、または列を作成できず、標準のID認証を使用できません。サインアップ、パスワード変更などを管理する必要はありません。パスワードとユーザー名でログインするだけです。どうやってやるの?
はい、できます。認証部分と承認部分は独立して機能します。独自の認証サービスをお持ちの場合は、OWINの認証部分を使用できます。 UserManager
とusername
を検証するpassword
が既にあると考えてください。したがって、ポストバックログインアクションで次のコードを記述できます。
[HttpPost]
public ActionResult Login(string username, string password)
{
if (new UserManager().IsValid(username, password))
{
var ident = new ClaimsIdentity(
new[] {
// adding following 2 claim just for supporting default antiforgery provider
new Claim(ClaimTypes.NameIdentifier, username),
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,username),
// optionally you could add roles if any
new Claim(ClaimTypes.Role, "RoleName"),
new Claim(ClaimTypes.Role, "AnotherRole"),
},
DefaultAuthenticationTypes.ApplicationCookie);
HttpContext.GetOwinContext().Authentication.SignIn(
new AuthenticationProperties { IsPersistent = false }, ident);
return RedirectToAction("MyAction"); // auth succeed
}
// invalid username or password
ModelState.AddModelError("", "invalid username or password");
return View();
}
ユーザーマネージャーは次のようになります。
class UserManager
{
public bool IsValid(string username, string password)
{
using(var db=new MyDbContext()) // use your DbConext
{
// for the sake of simplicity I use plain text passwords
// in real world hashing and salting techniques must be implemented
return db.Users.Any(u=>u.Username==username
&& u.Password==password);
}
}
}
最後に、Authorize
属性を追加して、アクションまたはコントローラーを保護できます。
[Authorize]
public ActionResult MySecretAction()
{
// all authorized users can use this method
// we have accessed current user principal by calling also
// HttpContext.User
}
[Authorize(Roles="Admin")]
public ActionResult MySecretAction()
{
// just Admin users have access to this method
}