1. ホーム
  2. c#

[解決済み] ASP.NET MVC 5でカスタム認証を実装する方法

2023-07-06 15:18:21

質問

ASP.NET MVC 5のアプリケーションを開発しています。私は既存のDBを持っており、そこから私のADO.NETエンティティデータモデルを作成しました。 そのDBには、"username"と"password"を含むテーブルがあり、それらを使用してWebアプリで認証と認可を実装したいと思っています。 私は、サインアップ、パスワードの変更、その他のものを管理する必要はなく、パスワードとユーザー名でログインするだけです。 どうすればよいのでしょうか。

どのように解決するのですか?

はい、できます。認証と認可の部分は独立して動作します。もしあなたが独自の認証サービスを持っているならば、OWINの認可パートを利用すればよいのです。もしあなたがすでに UserManager を検証する usernamepassword . したがって、以下のようなコードをログイン後のアクションに記述することができます。

[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
}