ASP.NET Identity 2.0 alphaには、UserManager
(app.UseUserManagerFactory
を使用してこれを設定し、DbContext
(app.UseDbContextFactory
これを設定します)。これをMVCアプリで動作させる方法を示す例がありますが、サンプルとは異なり、OAuthBearerTokens
を使用するSPAテンプレートからこれを動作させる方法に関するドキュメントはありません。
私は現在立ち往生しています:
UserManagerFactory = () => new DerivedUserManager(new CustomUserStore(new CustomDbContext()));
OAuthOptions = new Microsoft.Owin.Security.OAuth.OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new MyApp.Web.Api.Providers.ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
};
app.UseOAuthBearerTokens(OAuthOptions);
また、SPAテンプレートで使用されているUserManagerFactory
オブジェクトを操作しながら、上記のOAuthBearerTokens
を2.0アルファサンプルからの呼び出しに置き換える方法がわかりません。
app.UseDbContextFactory(ApplicationDbContext.Create);
// Configure the UserManager
app.UseUserManagerFactory(new IdentityFactoryOptions<ApplicationUserManager>()
{
DataProtectionProvider = app.GetDataProtectionProvider(),
Provider = new IdentityFactoryProvider<ApplicationUserManager>()
{
OnCreate = ApplicationUserManager.Create
}
});
ありがとう... -Ben
OAuthBearerTokensの使用方法を示すスタブをここに追加しています... SPAで使用していたUserManagerFactoryを使用する必要はありません。これを切り替えて、PerOWINContextパターンを使用できます。
Startup.Auth.cs
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
};
ApplicationOAuthProvider.cs
public ApplicationOAuthProvider(string publicClientId)
{
if (publicClientId == null)
{
throw new ArgumentNullException("publicClientId");
}
_publicClientId = publicClientId;
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();
ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return;
}
ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
OAuthDefaults.AuthenticationType);
ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager,
DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationProperties properties = CreateProperties(user.UserName);
AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
context.Validated(ticket);
context.Request.Context.Authentication.SignIn(cookiesIdentity);
}
// namespace below needed to enable GetUserManager extension of the OwinContext
using Microsoft.AspNet.Identity.Owin;
ASP.NET Identityには、アプリケーション要求ごとにUserManager
とID DBContext
の単一インスタンスを作成するためのサポートが含まれています。このパターンをサポートするには、IAppBuilder
オブジェクトごとに次の拡張メソッドを使用します。
app.CreatePerOwinContext<AppUserIdentityDbContext>(AppUserIdentityDbContext.Create);
app.CreatePerOwinContext<AppUserManager>(AppUserManager.Create);
このパターンを実装する優れた例を以下に示します。
AppManagerクラスは次のとおりです。
public class AppUserManager : UserManager<AppUserIdentity>
{
public AppUserManager(IUserStore<AppUserIdentity> store)
: base(store) { }
public static AppUserManager Create(IdentityFactoryOptions<AppUserManager> options, IOwinContext context)
{
var manager = new AppUserManager(new UserStore<AppUserIdentity>(context.Get<AppUserIdentityDbContext>()));
return manager;
}
}
この記事では、OWINミドルウェアコンポーネントUseOAuthBearerAuthentication
とUseCookieAuthentication
を使用して、単一のOwinコンテキストIdentityDbオブジェクトと単一のAppManagerとともにブラウザーベースの認証をサポートします。
OAuthBearerOptions = new OAuthBearerAuthenticationOptions();
//This will used the HTTP header: "Authorization" Value: "Bearer 1234123412341234asdfasdfasdfasdf"
app.UseOAuthBearerAuthentication(OAuthBearerOptions);
// Enable the application to use a cookie to store information for the signed in user
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login")
});
HostAuthenticationFilterは、OWINミドルウェアを介して認証する認証フィルターを表します。
config.SuppressDefaultHostAuthentication();
//This will used the HTTP header: "Authorization" Value: "Bearer 1234123412341234asdfasdfasdfasdf"
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
var identity = new ClaimsIdentity(Startup.OAuthBearerOptions.AuthenticationType);
identity.AddClaim(new Claim(ClaimTypes.Name, user));
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userIdentity.Id));
AuthenticationTicket ticket = new AuthenticationTicket(identity, new AuthenticationProperties());
var currentUtc = new SystemClock().UtcNow;
ticket.Properties.IssuedUtc = currentUtc;
ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(30));
string AccessToken = Startup.OAuthBearerOptions.AccessTokenFormat.Protect(ticket);
return AccessToken;
ベン、これらのいくつかはalpha1ビルドからbeta1ビルドに変更されました(現在、ASP.NET Nightly NuGet Repoで https://aspnetwebstack.codeplex.com/wikipage?title=Use%20Nightly%20Builds)で入手できます )。最新のベータ版にアップグレードすると、この構文は使用されなくなりますが、代わりにこれを使用します。
_// Configure the db context and user manager to use per request
app.CreatePerOwinContext(ApplicationIdentityContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
_
また、HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>
が_Microsoft.AspNet.Identity.Owin
_に移動されていることにも注意してください。
「Microsoft.AspNet.Identity.Samples」パッケージをインストールできます(ファイルを上書きする可能性があるため、新しいMVCプロジェクトにインストールすることが推奨されます)。いくつかのブログ投稿(alpha1ビルド用に書かれたもの)以外に、2.0のドキュメントが現時点では存在しないことを考慮して、彼らが特定のことをどのように行うかを知るのに役立ちました。