web-dev-qa-db-ja.com

ASP.NET MVC 5でカスタム認証を実装する方法

ASP.NET MVC 5アプリケーションを開発しています。既存のDBがあり、そこからADO.NET Entity Data Modelを作成しました。そのDBに「username」列と「password」列を含むテーブルがあり、それらを使用してWebappに認証と承認を実装します。顧客の要件により、他のデータベース、テーブル、または列を作成できず、標準のID認証を使用できません。サインアップ、パスワード変更などを管理する必要はありません。パスワードとユーザー名でログインするだけです。どうやってやるの?

72

はい、できます。認証部分と承認部分は独立して機能します。独自の認証サービスをお持ちの場合は、OWINの認証部分を使用できます。 UserManagerusernameを検証する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
} 
142