web-dev-qa-db-ja.com

Web API 2では、ベアラートークンはサーバー側にどのように保存されますか?

Web API 2でベアラートークン認証を設定していますが、サーバー側でベアラートークンがどのように(またはどこで)保存されるのかがわかりません。関連するコードは次のとおりです。

スタートアップ:

public partial class Startup
{
    public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }
    public static Func<UserManager<IdentityUser>> UserManagerFactory { get; set; }
    public static string PublicClientId { get; private set; }

    static Startup()
    {
        PublicClientId = "self";
        UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>());
        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
            AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
            AllowInsecureHttp = true
        };
    }

    public void ConfigureAuth(IAppBuilder app)
    {
        // Enable the application to use a cookie to store information for the signed in user
        app.UseCookieAuthentication(new CookieAuthenticationOptions());

        // Use a cookie to temporarily store information about a user logging in with a third party login provider
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        app.UseOAuthBearerTokens(OAuthOptions);
    }
}

WebApiConfig:

public class WebApiConfig
{
    public static void ConfigureWebApi()
    {
        Register(GlobalConfiguration.Configuration);
    }

    public static void Register(HttpConfiguration http)
    {
        AuthUtil.ConfigureWebApiToUseOnlyBearerTokenAuthentication(http);
        http.Routes.MapHttpRoute("ActionApi", "api/{controller}/{action}", new {action = Actions.Default});
    }
}

AuthUtil:

public class AuthUtil
{
    public static string Token(string email)
    {
        var identity = new ClaimsIdentity(Startup.OAuthOptions.AuthenticationType);
        identity.AddClaim(new Claim(ClaimTypes.Name, email));
        var ticket = new AuthenticationTicket(identity, new AuthenticationProperties());
        var currentUtc = new SystemClock().UtcNow;
        ticket.Properties.IssuedUtc = currentUtc;
        ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(30));
        var token = Startup.OAuthOptions.AccessTokenFormat.Protect(ticket);
        return token;
    }

    public static void ConfigureWebApiToUseOnlyBearerTokenAuthentication(HttpConfiguration http)
    {
        http.SuppressDefaultHostAuthentication();
        http.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
    }
}

LoginController:

public class LoginController : ApiController
{
    ...

    public HttpResponseMessage Post([FromBody] LoginJson loginJson)
    {
        HttpResponseMessage loginResponse;
        if (/* is valid login */)
        {
            var accessToken = AuthUtil.Token(loginJson.email);
            loginResponse = /* HTTP response including accessToken */;
        }
        else
        {
            loginResponse = /* HTTP response with error */;
        }
        return loginResponse;
    }
}

上記のコードを使用して、クライアント側でベアラトークンをログインしてCookieに保存し、[Authorize]でマークされたコントローラーを呼び出して、それを許可します。

私の質問は:

  1. サーバー側でベアラートークンはどこにどのように保存されますか?これは、OWIN呼び出しの1つを通過しているように見えますが、どこにあるのかわかりません。

  2. Web APIサーバーの再起動後もベアラートークンを保持してデータベースサーバー側に保持することはできますか?

  3. #2の答えが「いいえ」の場合、クライアントがベアラトークンを維持し、Web APIがダウンして再び戻った後でもそれを再利用することができますか?これは実稼働環境ではまれですが、ローカルテストを行うことは非常に頻繁に発生します。

57
dposada
  1. これらはサーバー側に保存されていません。クライアントに発行され、クライアントは各呼び出しでそれらを提示します。 owinホストの保護キーによって署名されているため、検証されています。 SystemWebホスティングでは、その保護キーはweb.configのmachineKey設定です。

  2. Owinホストが使用する保護キーがサーバーの再起動後も変わらない限り、これは不要です。

  3. クライアントは、トークンが有効である限り、トークンを保持できます。

87
Brock Allen

Web.configを設定する方法を探している人のために、ここにサンプルがあります

<system.web>
<machineKey validation="HMACSHA256" validationKey="64-hex"
                 decryption="AES" decryptionKey="another-64-hex"/>
</system.web>

それを機能させるには、validationKeyとdecriptionkeyの両方が必要です。

そして、ここにキーを生成する方法があります https://msdn.Microsoft.com/en-us/library/ms998288.aspx

3
Bruce Wang

これに追加するには、CookieAuthenticationOptionsのSessionStoreプロパティを使用して、トークンをサーバー側に永続化できます。私はこれを行うことを支持しませんが、あなたのトークンが過度に大きくなった場合はそこにあります。

これはIAuthenticationSessionStoreであるため、独自のストレージメディアを実装できます。

2
thisispaulsmith

デフォルトでは、トークンはサーバーに保存されません。あなたのクライアントだけがそれを持ち、承認ヘッダーを通してサーバーに送信しています。

Visual Studioが提供するデフォルトのテンプレートを使用した場合、Startup ConfigureAuthメソッドで次のIAppBuilder拡張機能が呼び出されます:app.UseOAuthBearerTokens(OAuthOptions)。

0
Supriya Verma