web-dev-qa-db-ja.com

Asp.NET MVC 5のClaimsIdentityオブジェクトを作成するにはどうすればよいですか?

.NET MVC 5アプリケーションで作業しています。 Entity Frameworkを使用したくありません。 RavenDBデータベースに対して認証したい。アカウントコントローラーに付属のUserManagerを交換したいようです。 ClaimsIdentityオブジェクトを理解していない場合を除き、すべてのUserManager関数をデータベースで動作するように書き換えることができると思います。

SignInAsyncメソッドには、UserManager.CreateIdentityAsync(...)の呼び出しがあります。 ClaimsIdentityオブジェクトを返すことは知っています。私が知らないのは、自分でClaimsIdentityオブジェクトを作成する方法です。

ActorBootstrapContextClaimsLabelの4つのプロパティがあることがわかります。これらのプロパティが何に使用されているのかわかりません。適切に生成する方法もわかりません。認証Cookieの作成方法であるため、正しく生成することが重要だと思います。

ClaimsIdentityオブジェクトの説明を見ました ここ ですが、それは本当に理解に役立ちませんでした。

CreateIdentityAsync()のコードを見ることができれば、おそらく役立つでしょう。

これについてすべて間違っている場合は、お知らせください。それ以外の場合、誰かがClaimsIdentityオブジェクトを生成する方法を教えてくれると助かります。

ClaimsIdentity identity = new ClaimsIdentity
{
    Actor = ????,
    BootstrapContext = ?????,
    Claims = ?????,
    Label = ?????
}
27
user1304444

おそらく リンクをたどる が役に立つでしょう:

var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, "Brock"));
claims.Add(new Claim(ClaimTypes.Email, "[email protected]"));
var id = new ClaimsIdentity(claims,DefaultAuthenticationTypes.ApplicationCookie);

var ctx = Request.GetOwinContext();
var authenticationManager = ctx.Authentication;
authenticationManager.SignIn(id);
43
Vlince

あなたは「これについてすべて間違っている」と思う。 ASP.NET Identity Frameworkは、プラグ可能な永続性を念頭に置いて設計されています。 EFをRavenDBに置き換える正しい方法は、UserManagerを置き換えることではありません。むしろ、代わりのUserStoreを実装することです。したがって、AccountControllerを作成するUserManagerの行は次のように変更されます。

public AccountController()
    : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))

に:

public AccountController()
    : this(new UserManager<ApplicationUser>(new RavenDBUserStore<ApplicationUser>/* connection info here*/)))

RavenDBUserStoreは、IUserStoreIUserPasswordStore、および特定のアプリケーションに必要なその他の* Storeインターフェイスを実装した、作成したクラスです。

このアプローチにより、UserManagerのすべてを理解して再実装する必要がなくなり、UserManagerの将来の改善を確実に活用できるようになります。 MS。

これを行う方法の詳細については、 ASP.NET Identityのカスタムストレージプロバイダーの概要 および カスタムMySQL ASP.NET IDストレージプロバイダーの実装 の例を参照してください。また、 answer で言及されている David Boike によって作成された RavenDB.AspNet.Identity Nuget Package のコードもチェックアウトする必要があります。ソースは https://github.com/ILMServices/RavenDB.AspNet.Identity/tree/master/RavenDB.AspNet.Identity のgithubにあります

これが私が思いついたものです。これがこのタスクを達成する正しい方法であるかどうかを知りたいです。

デフォルトのMVC5 Webサイトで作業しているときに、アカウントコントローラーにアクセスすると、SignInAsync()関数が見つかりました。次のように調整しました。

_    private async Task SignInAsync(ApplicationUser user, bool isPersistent)
    {
        AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
        //var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); --> this is where I want to get rid of UserManager
        List<Claim> claims = new List<Claim>{
            new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", user.Name), //user.Name from my database
            new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", user.Id), //user.Id from my database
            new Claim("http://schemas.Microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "MyApplication"),
            new Claim("FirstName", user.FirstName) //user.FirstName from my database
        };
        ClaimsIdentity identity = new System.Security.Claims.ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);

        AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
    }
_

これには、UserManager.FindAsync()関数を使用する代わりに、データベースからユーザーを取得するために_[HttpPost] Login_関数を変更する必要もあることに注意してください。

デフォルトサイトのLogIn/LogOff部分は、これらの調整後に正常に機能するようです。なぜこのようにしないのかを誰かが教えてくれる場合に備えて、この答えを受け入れる前にしばらくここに残しておきます。

9
user1304444

新しいASP.NET MVC 5 IdentityのRavenDB実装を作成し、NuGetパッケージとしてリリースしました。これはあなたのために働くかもしれません。

http://www.nuget.org/packages/RavenDB.AspNet.Identity/

多少プレリリースですが、実際のプロジェクトで使用しています。

GitHubプロジェクトRavenDBディスカッショングループのショートスレッド を紹介します。

6
David Boike

ここにQ/Aを投稿しても、コメントセクションに収まらない問題がないことを願っています

@Katstevensはあなたにぴったりです:私のチームメイトはこのソリューションを見つけて長期間使用しているので、自分のアプリケーションにも実装しますが、getUserIdが機能しなかったので、ここにあるものを見つけましたGlobal.aspx startメソッドで、カスタムデータにクレームを追加します。

protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
{
    HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
    if (authCookie != null)
    {
        FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
        CustomPrincipalSerializeModel serializeModel = JsonConvert.DeserializeObject<CustomPrincipalSerializeModel>(authTicket.UserData);
        CustomPrincipal newUser = new CustomPrincipal(authTicket.Name);
        newUser.UserId = serializeModel.UserId;
        newUser.UserName = serializeModel.UserName;
        newUser.NameFamily = serializeModel.NameFamily;
        newUser.IP = serializeModel.IP;
        newUser.roles = serializeModel.roles;
        HttpContext.Current.User = newUser;
        System.Threading.Thread.CurrentPrincipal = newUser;

        //Added by myself... (make UserId work as identity.GetUserId())
        (newUser.Identity as ClaimsIdentity)?.AddClaims(new List<Claim>{
            new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", authTicket.Name), //user.Name from my database
            new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", serializeModel.UserId), //user.Id from my database
            new Claim("http://schemas.Microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "RealEstate"), //MyApplication
        });
    }
}

はい、動作しますが、このようにするのは正しいことですか?データはどこから来るべきですか、これはどこで起こるべきですか? ETC ....データはかけがえのないものですか?安全ですか?

0
deadManN