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


80

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

回答:


158

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

7
私はあなたの質問に答えるために私の投稿を更新しました。
Sam FarajpourGhamari 2015

5
ねえ、私はあなたのgithubの例(tokenauth用)が私の問題を解決したことをあなたに知らせたいと思いました、どうもありがとう!できればあなたの例を1000回賛成します:)
AME 2016年

6
必要なnugetパッケージ:-Microsoft.AspNet.Identity.Core-Microsoft.AspNet.Identity.Owin-Microsoft.Owin-Microsoft.Owin.Host.SystemWeb-Microsoft.Owin.Security-Microsoft.Owin.Security.Cookies-Microsoft.Owin .Security.OAuth - Owin
マチュー

5
+1000を差し上げますので、この質問に対してオープンな報奨金があればいいのにと思います。検索エンジンがこれに到達できるように、これをブログのどこかに投稿してください。それはとても簡単でエレガントなソリューションです。OWINとOAuth2の提供について2日間読んだのですが、配線を接続できませんでした。
adopilot 2016年

2
@SamFarajpourGhamari:Loginコードに長いconst文字列が必要な理由を説明できますか?... new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string")コードがなくても問題なく動作することを確認しました。
S.Serpooshan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.