4

SPA テンプレートから、基本的な OAuth フローを機能させることができました。

    OAuthOptions = new OAuthAuthorizationServerOptions
    {
        AllowInsecureHttp = true, 
        ApplicationCanDisplayErrors = true,
        TokenEndpointPath = new Microsoft.Owin.PathString("/Token"),
        AuthorizeEndpointPath = new Microsoft.Owin.PathString("/api/Account/ExternalLogin"),
        Provider = new CompositeWebroleOauthProvider<User>(PublicClientId, IdentityManagerFactory, CookieOptions)
    };

トークン エンドポイントからのベアラー トークンを使用して webapi と対話する別のドメインでホストされている単一ページ アプリケーションがあります。

次のデータを含むリクエストで、ResourceOwnerCredentials フローを実行しています。

 data: {
        grant_type: "password",
        username: username,
        password: password
       }

これらのトークンは短命です。私は今、アプリケーションを拡張して、refress トークンを取得できるようにしたり、常に認証する必要がないようなものにしたいと考えています。次のステップは何ですか?

GrantResourceOwnerCredentials 実装:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    using (var identityManager = _identityManagerFactory.Create())
    {
        var user = await identityManager.FindAsync(context.UserName, context.Password);

        if (user == null)
        {
            context.SetError("invalid_grant", "The user name or password is incorrect.");
            return;
        }               

        ClaimsIdentity oAuthIdentity = await identityManager.CreateIdentityAsync(user, context.Options.AuthenticationType);
        AuthenticationProperties properties = CreatePropertiesAsync(user);
        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
        context.Validated(ticket);

    }
}
4

1 に答える 1

0

更新トークンを生成するには、プロバイダーを設定する必要がありました。

いつ更新トークンを設定するかについてのポインタのコメントはいいでしょう。

 RefreshTokenProvider = new AuthenticationTokenProvider
 {
     OnCreate = CreateRefreshToken,
     OnReceive = ReceiveRefreshToken,
 }


    private void CreateRefreshToken(AuthenticationTokenCreateContext context)
    {
        context.SetToken(context.SerializeTicket());
    }

    private void ReceiveRefreshToken(AuthenticationTokenReceiveContext context)
    {
        context.DeserializeTicket(context.Token);
    }
于 2013-10-16T15:03:51.463 に答える