mirror of
https://gitee.com/dcren/openiddict-documentation.git
synced 2025-04-05 17:38:03 +08:00
Update the documentation pages
This commit is contained in:
parent
f4f15466c4
commit
cf7d02d6d9
@ -8,7 +8,7 @@
|
||||
<title>Application permissions </title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="title" content="Application permissions ">
|
||||
<meta name="generator" content="docfx 2.24.0.0">
|
||||
<meta name="generator" content="docfx 2.45.1.0">
|
||||
|
||||
<link rel="shortcut icon" href="../favicon.ico">
|
||||
<link rel="stylesheet" href="../styles/docfx.vendor.css">
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
|
||||
</head>
|
||||
<body data-spy="scroll" data-target="#affix">
|
||||
<body data-spy="scroll" data-target="#affix" data-offset="120">
|
||||
<div id="wrapper">
|
||||
<header>
|
||||
|
||||
@ -146,9 +146,9 @@ token endpoints but will get an error when trying to send an introspection or re
|
||||
options.IgnoreEndpointPermissions();
|
||||
});
|
||||
</code></pre><h2 id="grant-type-permissions">Grant type permissions</h2>
|
||||
<h3 id="definition">Definition</h3>
|
||||
<h3 id="definition-1">Definition</h3>
|
||||
<p>Grant type permissions limit the flows a client application is allowed to use.</p>
|
||||
<h3 id="supported-permissions">Supported permissions</h3>
|
||||
<h3 id="supported-permissions-1">Supported permissions</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
@ -181,7 +181,7 @@ token endpoints but will get an error when trying to send an introspection or re
|
||||
</table>
|
||||
<p>To add a custom flow permission, you can use the following pattern:</p>
|
||||
<pre><code class="lang-csharp">OpenIddictConstants.Permissions.Prefixes.GrantType + "custom_flow_name"
|
||||
</code></pre><h3 id="example">Example</h3>
|
||||
</code></pre><h3 id="example-1">Example</h3>
|
||||
<p>In the following example, the <code>postman</code> application can only use the authorization code flow
|
||||
while <code>console</code> is restricted to the <code>password</code> and <code>refresh_token</code> flows:</p>
|
||||
<pre><code class="lang-csharp">if (await manager.FindByClientIdAsync("postman") == null)
|
||||
@ -224,11 +224,11 @@ if (await manager.FindByClientIdAsync("console") == null)
|
||||
options.IgnoreGrantTypePermissions();
|
||||
});
|
||||
</code></pre><h2 id="scope-permissions">Scope permissions</h2>
|
||||
<h3 id="definition">Definition</h3>
|
||||
<h3 id="definition-2">Definition</h3>
|
||||
<p>Scope permissions limit the scopes (standard or custom) a client application is allowed to use.</p>
|
||||
<blockquote><p>The <code>openid</code> and <code>offline_access</code> scopes are special-cased by OpenIddict and don't require explicit permissions.</p>
|
||||
</blockquote>
|
||||
<h3 id="supported-permissions">Supported permissions</h3>
|
||||
<h3 id="supported-permissions-2">Supported permissions</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
@ -261,7 +261,7 @@ if (await manager.FindByClientIdAsync("console") == null)
|
||||
</table>
|
||||
<p>To add a custom scope permission, you can use the following pattern:</p>
|
||||
<pre><code class="lang-csharp">OpenIddictConstants.Permissions.Prefixes.Scope + "custom_scope_name"
|
||||
</code></pre><h3 id="example">Example</h3>
|
||||
</code></pre><h3 id="example-2">Example</h3>
|
||||
<p>In the following sample, the <code>angular</code> client is allowed to request the <code>address</code>,
|
||||
<code>profile</code> and <code>marketing_api</code> scopes: any other scope will result in an error being returned.</p>
|
||||
<pre><code class="lang-csharp">if (await manager.FindByClientIdAsync("angular") == null)
|
||||
@ -317,7 +317,7 @@ if (await manager.FindByClientIdAsync("console") == null)
|
||||
<a href="#top">Back to top</a>
|
||||
</span>
|
||||
|
||||
<span>Copyright © 2015-2017 Microsoft<br>Generated by <strong>DocFX</strong></span>
|
||||
<span>Generated by <strong>DocFX</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
@ -8,7 +8,7 @@
|
||||
<title>Configuration and settings </title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="title" content="Configuration and settings ">
|
||||
<meta name="generator" content="docfx 2.24.0.0">
|
||||
<meta name="generator" content="docfx 2.45.1.0">
|
||||
|
||||
<link rel="shortcut icon" href="../favicon.ico">
|
||||
<link rel="stylesheet" href="../styles/docfx.vendor.css">
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
|
||||
</head>
|
||||
<body data-spy="scroll" data-target="#affix">
|
||||
<body data-spy="scroll" data-target="#affix" data-offset="120">
|
||||
<div id="wrapper">
|
||||
<header>
|
||||
|
||||
@ -114,7 +114,7 @@
|
||||
<a href="#top">Back to top</a>
|
||||
</span>
|
||||
|
||||
<span>Copyright © 2015-2017 Microsoft<br>Generated by <strong>DocFX</strong></span>
|
||||
<span>Generated by <strong>DocFX</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
@ -1,65 +1,4 @@
|
||||
<!DOCTYPE html>
|
||||
<!--[if IE]><![endif]-->
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<title>Table of Content </title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="title" content="Table of Content ">
|
||||
<meta name="generator" content="docfx 2.24.0.0">
|
||||
|
||||
<link rel="shortcut icon" href="../favicon.ico">
|
||||
<link rel="stylesheet" href="../styles/docfx.vendor.css">
|
||||
<link rel="stylesheet" href="../styles/docfx.css">
|
||||
<link rel="stylesheet" href="../styles/main.css">
|
||||
<meta property="docfx:navrel" content="../toc.html">
|
||||
<meta property="docfx:tocrel" content="toc.html">
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
<body data-spy="scroll" data-target="#affix">
|
||||
<div id="wrapper">
|
||||
<header>
|
||||
|
||||
<nav id="autocollapse" class="navbar navbar-inverse ng-scope" role="navigation">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
|
||||
<a class="navbar-brand" href="../index.html">
|
||||
<img id="logo" class="svg" src="../logo.svg" alt="">
|
||||
</a>
|
||||
</div>
|
||||
<div class="collapse navbar-collapse" id="navbar">
|
||||
<form class="navbar-form navbar-right" role="search" id="search">
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control" id="search-query" placeholder="Search" autocomplete="off">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="subnav navbar navbar-default">
|
||||
<div class="container hide-when-search" id="breadcrumb">
|
||||
<ul class="breadcrumb">
|
||||
<li></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<div role="main" class="container body-content hide-when-search">
|
||||
<div class="article row grid">
|
||||
<div class="col-md-10">
|
||||
<article class="content wrap" id="_content" data-uid="">
|
||||
|
||||
<div id="sidetoggle">
|
||||
<div>
|
||||
<div class="sidefilter">
|
||||
@ -72,51 +11,17 @@
|
||||
<div class="toc" id="toc">
|
||||
|
||||
<ul class="nav level1">
|
||||
<li>
|
||||
<a href="index.html" name="" title="Introduction">Introduction</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="token-setup-and-validation.html" name="" title="Token setup and API validation">Token setup and API validation</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="application-permissions.html" name="" title="Application permissions">Application permissions</a>
|
||||
</li>
|
||||
</ul> </div>
|
||||
<li>
|
||||
<a href="index.html" name="" title="Introduction">Introduction</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="token-setup-and-validation.html" name="" title="Token setup and API validation">Token setup and API validation</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="application-permissions.html" name="" title="Application permissions">Application permissions</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div></article>
|
||||
</div>
|
||||
|
||||
<div class="hidden-sm col-md-2" role="complementary">
|
||||
<div class="sideaffix">
|
||||
<div class="contribution">
|
||||
<ul class="nav">
|
||||
</ul>
|
||||
</div>
|
||||
<nav class="bs-docs-sidebar hidden-print hidden-xs hidden-sm affix" id="affix">
|
||||
<!-- <p><a class="back-to-top" href="#top">Back to top</a><p> -->
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer>
|
||||
<div class="grad-bottom"></div>
|
||||
<div class="footer">
|
||||
<div class="container">
|
||||
<span class="pull-right">
|
||||
<a href="#top">Back to top</a>
|
||||
</span>
|
||||
|
||||
<span>Copyright © 2015-2017 Microsoft<br>Generated by <strong>DocFX</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" src="../styles/docfx.vendor.js"></script>
|
||||
<script type="text/javascript" src="../styles/docfx.js"></script>
|
||||
<script type="text/javascript" src="../styles/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
</div>
|
@ -8,7 +8,7 @@
|
||||
<title>Token setup and validation </title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="title" content="Token setup and validation ">
|
||||
<meta name="generator" content="docfx 2.24.0.0">
|
||||
<meta name="generator" content="docfx 2.45.1.0">
|
||||
|
||||
<link rel="shortcut icon" href="../favicon.ico">
|
||||
<link rel="stylesheet" href="../styles/docfx.vendor.css">
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
|
||||
</head>
|
||||
<body data-spy="scroll" data-target="#affix">
|
||||
<body data-spy="scroll" data-target="#affix" data-offset="120">
|
||||
<div id="wrapper">
|
||||
<header>
|
||||
|
||||
@ -111,7 +111,7 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerF
|
||||
//...
|
||||
}
|
||||
</code></pre><h2 id="default-token-validation">Default token validation</h2>
|
||||
<h3 id="authorization-server">Authorization server</h3>
|
||||
<h3 id="authorization-server-1">Authorization server</h3>
|
||||
<pre><code class="lang-csharp">// Startup.cs
|
||||
|
||||
public void ConfigureServices(IServiceCollection services)
|
||||
@ -209,7 +209,7 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerF
|
||||
public class MyController : Controller
|
||||
</code></pre><h1 id="reference-token-format">Reference token format</h1>
|
||||
<h2 id="reference-token-generation">Reference token generation</h2>
|
||||
<h3 id="authorization-server">Authorization server</h3>
|
||||
<h3 id="authorization-server-2">Authorization server</h3>
|
||||
<pre><code class="lang-c#">// Startup.cs
|
||||
|
||||
public void ConfigureServices(IServiceCollection services)
|
||||
@ -243,7 +243,7 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerF
|
||||
//...
|
||||
}
|
||||
</code></pre><h2 id="reference-token-validation">Reference token validation</h2>
|
||||
<h3 id="authorization-server">Authorization server</h3>
|
||||
<h3 id="authorization-server-3">Authorization server</h3>
|
||||
<pre><code class="lang-c#">// Startup.cs
|
||||
|
||||
public void ConfigureServices(IServiceCollection services)
|
||||
@ -306,7 +306,7 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerF
|
||||
app.UseAuthentication();
|
||||
//...
|
||||
}
|
||||
</code></pre><h3 id="api-controller">Api controller</h3>
|
||||
</code></pre><h3 id="api-controller-1">Api controller</h3>
|
||||
<pre><code class="lang-c#">// Note: both OpenIddictValidationDefaults.AuthenticationScheme and JwtBearerDefaults.AuthenticationScheme are "Bearer"
|
||||
//If you did not set the default authentication scheme then specify it here.
|
||||
//If you get a 302 redirect to login page instead of a 401 Unauthorized then Cookie authentication is handling the request
|
||||
@ -315,7 +315,7 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerF
|
||||
public class MyController : Controller
|
||||
</code></pre><h1 id="jwts">JWTs</h1>
|
||||
<h2 id="jwt-generation">JWT generation</h2>
|
||||
<h3 id="authorization-server">Authorization server</h3>
|
||||
<h3 id="authorization-server-4">Authorization server</h3>
|
||||
<pre><code class="lang-c#">// Startup.cs
|
||||
|
||||
public void ConfigureServices(IServiceCollection services)
|
||||
@ -352,7 +352,7 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerF
|
||||
// <EmbeddedResource Include="FolderName\certname.pfx" />
|
||||
// </ItemGroup>
|
||||
</code></pre><h2 id="jwt-validation">JWT validation</h2>
|
||||
<h3 id="authorization-server">Authorization server</h3>
|
||||
<h3 id="authorization-server-5">Authorization server</h3>
|
||||
<div class="WARNING"><h5>Warning</h5><p>Remember, this is only needed if you have API endpoints that require token authorization. If your authorization server generates tokens that are only used by separate resource servers, then this is not needed.</p>
|
||||
</div>
|
||||
<pre><code class="lang-c#">// Startup.cs
|
||||
@ -385,7 +385,7 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerF
|
||||
app.UseAuthentication();
|
||||
//...
|
||||
}
|
||||
</code></pre><h3 id="resource-server">Resource server</h3>
|
||||
</code></pre><h3 id="resource-server-1">Resource server</h3>
|
||||
<pre><code class="lang-c#">// Startup.cs
|
||||
|
||||
public void ConfigureServices(IServiceCollection services)
|
||||
@ -408,7 +408,7 @@ public void ConfigureServices(IServiceCollection services)
|
||||
};
|
||||
});
|
||||
}
|
||||
</code></pre><h3 id="api-controller">Api controller</h3>
|
||||
</code></pre><h3 id="api-controller-2">Api controller</h3>
|
||||
<pre><code class="lang-c#">// Note: both OpenIddictValidationDefaults.AuthenticationScheme and JwtBearerDefaults.AuthenticationScheme are "Bearer"
|
||||
//If you didn't set the default authentication scheme then specify it here.
|
||||
//If you get a 302 redirect to login page instead of a 401 Unauthorized then Cookie authentication is handling the request
|
||||
@ -443,7 +443,7 @@ public class MyController : Controller
|
||||
<a href="#top">Back to top</a>
|
||||
</span>
|
||||
|
||||
<span>Copyright © 2015-2017 Microsoft<br>Generated by <strong>DocFX</strong></span>
|
||||
<span>Generated by <strong>DocFX</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
@ -8,7 +8,7 @@
|
||||
<title>Getting started </title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="title" content="Getting started ">
|
||||
<meta name="generator" content="docfx 2.24.0.0">
|
||||
<meta name="generator" content="docfx 2.45.1.0">
|
||||
|
||||
<link rel="shortcut icon" href="../favicon.ico">
|
||||
<link rel="stylesheet" href="../styles/docfx.vendor.css">
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
|
||||
</head>
|
||||
<body data-spy="scroll" data-target="#affix">
|
||||
<body data-spy="scroll" data-target="#affix" data-offset="120">
|
||||
<div id="wrapper">
|
||||
<header>
|
||||
|
||||
@ -264,7 +264,7 @@ using (var scope = app.ApplicationServices.CreateScope())
|
||||
<a href="#top">Back to top</a>
|
||||
</span>
|
||||
|
||||
<span>Copyright © 2015-2017 Microsoft<br>Generated by <strong>DocFX</strong></span>
|
||||
<span>Generated by <strong>DocFX</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
@ -8,7 +8,7 @@
|
||||
<title>Introduction </title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="title" content="Introduction ">
|
||||
<meta name="generator" content="docfx 2.24.0.0">
|
||||
<meta name="generator" content="docfx 2.45.1.0">
|
||||
|
||||
<link rel="shortcut icon" href="../favicon.ico">
|
||||
<link rel="stylesheet" href="../styles/docfx.vendor.css">
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
|
||||
</head>
|
||||
<body data-spy="scroll" data-target="#affix">
|
||||
<body data-spy="scroll" data-target="#affix" data-offset="120">
|
||||
<div id="wrapper">
|
||||
<header>
|
||||
|
||||
@ -111,7 +111,7 @@ with the power to control who can access your API and the information that is ex
|
||||
<a href="#top">Back to top</a>
|
||||
</span>
|
||||
|
||||
<span>Copyright © 2015-2017 Microsoft<br>Generated by <strong>DocFX</strong></span>
|
||||
<span>Generated by <strong>DocFX</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
@ -8,7 +8,7 @@
|
||||
<title>Migrate to OpenIddict RC3 </title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="title" content="Migrate to OpenIddict RC3 ">
|
||||
<meta name="generator" content="docfx 2.24.0.0">
|
||||
<meta name="generator" content="docfx 2.45.1.0">
|
||||
|
||||
<link rel="shortcut icon" href="../favicon.ico">
|
||||
<link rel="stylesheet" href="../styles/docfx.vendor.css">
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
|
||||
</head>
|
||||
<body data-spy="scroll" data-target="#affix">
|
||||
<body data-spy="scroll" data-target="#affix" data-offset="120">
|
||||
<div id="wrapper">
|
||||
<header>
|
||||
|
||||
@ -281,15 +281,15 @@ folder in your application root folder and an <code>__EFMigrationsHistory</code>
|
||||
Version="2.0.0" />
|
||||
</ItemGroup>
|
||||
</code></pre><p>Then, open a new command line and add an initial migration using <code>dotnet ef migrations add InitialMigration</code> (<strong>but don't apply it!</strong>).</p>
|
||||
<h2 id="update-your-packages-references">Update your packages references</h2>
|
||||
<h2 id="update-your-packages-references-1">Update your packages references</h2>
|
||||
<p>For that, simply update your <code>.csproj</code> file to point to the newest OpenIddict packages:</p>
|
||||
<h3 id="aspnet-core-1x">ASP.NET Core 1.x</h3>
|
||||
<h3 id="aspnet-core-1x-1">ASP.NET Core 1.x</h3>
|
||||
<pre><code class="lang-xml"><ItemGroup>
|
||||
<PackageReference Include="OpenIddict" Version="1.0.0-rc2-final" />
|
||||
<PackageReference Include="OpenIddict.EntityFrameworkCore" Version="1.0.0-rc2-final" />
|
||||
<PackageReference Include="OpenIddict.Mvc" Version="1.0.0-rc2-final" />
|
||||
</ItemGroup>
|
||||
</code></pre><h3 id="aspnet-core-2x">ASP.NET Core 2.x</h3>
|
||||
</code></pre><h3 id="aspnet-core-2x-1">ASP.NET Core 2.x</h3>
|
||||
<pre><code class="lang-xml"><ItemGroup>
|
||||
<PackageReference Include="OpenIddict" Version="2.0.0-rc2-final" />
|
||||
<PackageReference Include="OpenIddict.EntityFrameworkCore" Version="2.0.0-rc2-final" />
|
||||
@ -550,7 +550,7 @@ controlling and limiting the OAuth2/OpenID Connect features a client application
|
||||
<a href="#top">Back to top</a>
|
||||
</span>
|
||||
|
||||
<span>Copyright © 2015-2017 Microsoft<br>Generated by <strong>DocFX</strong></span>
|
||||
<span>Generated by <strong>DocFX</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
@ -8,7 +8,7 @@
|
||||
<title>Samples </title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="title" content="Samples ">
|
||||
<meta name="generator" content="docfx 2.24.0.0">
|
||||
<meta name="generator" content="docfx 2.45.1.0">
|
||||
|
||||
<link rel="shortcut icon" href="../favicon.ico">
|
||||
<link rel="stylesheet" href="../styles/docfx.vendor.css">
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
|
||||
</head>
|
||||
<body data-spy="scroll" data-target="#affix">
|
||||
<body data-spy="scroll" data-target="#affix" data-offset="120">
|
||||
<div id="wrapper">
|
||||
<header>
|
||||
|
||||
@ -107,7 +107,7 @@
|
||||
<a href="#top">Back to top</a>
|
||||
</span>
|
||||
|
||||
<span>Copyright © 2015-2017 Microsoft<br>Generated by <strong>DocFX</strong></span>
|
||||
<span>Generated by <strong>DocFX</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
133
guide/toc.html
133
guide/toc.html
@ -1,65 +1,4 @@
|
||||
<!DOCTYPE html>
|
||||
<!--[if IE]><![endif]-->
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<title>Table of Content </title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="title" content="Table of Content ">
|
||||
<meta name="generator" content="docfx 2.24.0.0">
|
||||
|
||||
<link rel="shortcut icon" href="../favicon.ico">
|
||||
<link rel="stylesheet" href="../styles/docfx.vendor.css">
|
||||
<link rel="stylesheet" href="../styles/docfx.css">
|
||||
<link rel="stylesheet" href="../styles/main.css">
|
||||
<meta property="docfx:navrel" content="../toc.html">
|
||||
<meta property="docfx:tocrel" content="toc.html">
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
<body data-spy="scroll" data-target="#affix">
|
||||
<div id="wrapper">
|
||||
<header>
|
||||
|
||||
<nav id="autocollapse" class="navbar navbar-inverse ng-scope" role="navigation">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
|
||||
<a class="navbar-brand" href="../index.html">
|
||||
<img id="logo" class="svg" src="../logo.svg" alt="">
|
||||
</a>
|
||||
</div>
|
||||
<div class="collapse navbar-collapse" id="navbar">
|
||||
<form class="navbar-form navbar-right" role="search" id="search">
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control" id="search-query" placeholder="Search" autocomplete="off">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="subnav navbar navbar-default">
|
||||
<div class="container hide-when-search" id="breadcrumb">
|
||||
<ul class="breadcrumb">
|
||||
<li></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<div role="main" class="container body-content hide-when-search">
|
||||
<div class="article row grid">
|
||||
<div class="col-md-10">
|
||||
<article class="content wrap" id="_content" data-uid="">
|
||||
|
||||
<div id="sidetoggle">
|
||||
<div>
|
||||
<div class="sidefilter">
|
||||
@ -72,57 +11,23 @@
|
||||
<div class="toc" id="toc">
|
||||
|
||||
<ul class="nav level1">
|
||||
<li>
|
||||
<a href="index.html" name="" title="Introduction">Introduction</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="getting-started.html" name="" title="Getting started">Getting started</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="samples.html" name="" title="Samples">Samples</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="migration.html" name="" title="Migration guide">Migration guide</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="token-formats.html" name="" title="Understanding the different token formats">Understanding the different token formats</a>
|
||||
</li>
|
||||
</ul> </div>
|
||||
<li>
|
||||
<a href="index.html" name="" title="Introduction">Introduction</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="getting-started.html" name="" title="Getting started">Getting started</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="samples.html" name="" title="Samples">Samples</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="migration.html" name="" title="Migration guide">Migration guide</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="token-formats.html" name="" title="Understanding the different token formats">Understanding the different token formats</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div></article>
|
||||
</div>
|
||||
|
||||
<div class="hidden-sm col-md-2" role="complementary">
|
||||
<div class="sideaffix">
|
||||
<div class="contribution">
|
||||
<ul class="nav">
|
||||
</ul>
|
||||
</div>
|
||||
<nav class="bs-docs-sidebar hidden-print hidden-xs hidden-sm affix" id="affix">
|
||||
<!-- <p><a class="back-to-top" href="#top">Back to top</a><p> -->
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer>
|
||||
<div class="grad-bottom"></div>
|
||||
<div class="footer">
|
||||
<div class="container">
|
||||
<span class="pull-right">
|
||||
<a href="#top">Back to top</a>
|
||||
</span>
|
||||
|
||||
<span>Copyright © 2015-2017 Microsoft<br>Generated by <strong>DocFX</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" src="../styles/docfx.vendor.js"></script>
|
||||
<script type="text/javascript" src="../styles/docfx.js"></script>
|
||||
<script type="text/javascript" src="../styles/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
</div>
|
@ -8,7 +8,7 @@
|
||||
<title>Understanding the different token formats </title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="title" content="Understanding the different token formats ">
|
||||
<meta name="generator" content="docfx 2.24.0.0">
|
||||
<meta name="generator" content="docfx 2.45.1.0">
|
||||
|
||||
<link rel="shortcut icon" href="../favicon.ico">
|
||||
<link rel="stylesheet" href="../styles/docfx.vendor.css">
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
|
||||
</head>
|
||||
<body data-spy="scroll" data-target="#affix">
|
||||
<body data-spy="scroll" data-target="#affix" data-offset="120">
|
||||
<div id="wrapper">
|
||||
<header>
|
||||
|
||||
@ -100,7 +100,7 @@
|
||||
<hr>
|
||||
<h2 id="reference-tokens">Reference tokens</h2>
|
||||
<p>When using reference token format, authorization codes, access tokens and refresh tokens are stored as ciphertext in the database and a crypto-secure random identifier is returned to the client application.</p>
|
||||
<h3 id="benefits">Benefits</h3>
|
||||
<h3 id="benefits-1">Benefits</h3>
|
||||
<ul>
|
||||
<li>Minimal configuration required</li>
|
||||
<li>Uses OpenIddict's built-in validation</li>
|
||||
@ -109,30 +109,30 @@
|
||||
<li>Issued tokens are tracked in data store</li>
|
||||
<li>Can immediately be revoked</li>
|
||||
</ul>
|
||||
<h3 id="drawbacks">Drawbacks</h3>
|
||||
<h3 id="drawbacks-1">Drawbacks</h3>
|
||||
<ul>
|
||||
<li>.NET Core validation only (although someone could write it for other platforms)</li>
|
||||
<li>Requires a connection to OpenIddict's data store, e.g. Entity Framework DataContext. Resource servers may not want to have to reference OpenIddict's database</li>
|
||||
<li>Because only ids are in the access tokens, a call to the database is required for every request</li>
|
||||
</ul>
|
||||
<h3 id="setup-and-api-validation-configuration">Setup and API validation configuration</h3>
|
||||
<h3 id="setup-and-api-validation-configuration-1">Setup and API validation configuration</h3>
|
||||
<p><a href="../configuration/token-setup-and-validation.html#reference-token-format">Here</a></p>
|
||||
<hr>
|
||||
<h2 id="jwts-json-web-tokens">JWTs (JSON Web Tokens)</h2>
|
||||
<p>These are standard tokens verifiable by third parties, used by Azure Active Directory, Auth0, and other valid OAuth 2.0 service. They are signed by the authorization server but their contents are not encrypted so they can be read by anyone.</p>
|
||||
<h3 id="benefits">Benefits</h3>
|
||||
<h3 id="benefits-2">Benefits</h3>
|
||||
<ul>
|
||||
<li>Good to be familiar with JWTs because they are a commonly used access token type in OAuth 2.0 and are also <code>id token</code> type</li>
|
||||
<li>Plenty of platforms include JWT validation libraries (.NET, PHP, Node, Python, etc)</li>
|
||||
<li>Future proof</li>
|
||||
</ul>
|
||||
<h3 id="drawbacks">Drawbacks</h3>
|
||||
<h3 id="drawbacks-2">Drawbacks</h3>
|
||||
<ul>
|
||||
<li>Anyone can inspect contents (see <a href="https://jwt.io/">https://jwt.io/</a>), so if token is hanging around in a log somewhere or intercepted somehow all claims or other information in the token can be read, even if token is expired</li>
|
||||
<li>Claims are stored within the token, which is convenient but token size could get large if there are a lot of claims (probably not an issue in real-world scenarios)</li>
|
||||
<li>Token expiration is in the token itself, so even if users sign out their tokens will still be valid until they reach their expiration</li>
|
||||
</ul>
|
||||
<h3 id="setup-and-api-validation-configuration">Setup and API validation configuration</h3>
|
||||
<h3 id="setup-and-api-validation-configuration-2">Setup and API validation configuration</h3>
|
||||
<p><a href="../configuration/token-setup-and-validation.html#jwts">Here</a></p>
|
||||
</article>
|
||||
</div>
|
||||
@ -162,7 +162,7 @@
|
||||
<a href="#top">Back to top</a>
|
||||
</span>
|
||||
|
||||
<span>Copyright © 2015-2017 Microsoft<br>Generated by <strong>DocFX</strong></span>
|
||||
<span>Generated by <strong>DocFX</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
@ -8,7 +8,7 @@
|
||||
<title>OpenIddict: the OpenID Connect server you'll be addicted to </title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="title" content="OpenIddict: the OpenID Connect server you'll be addicted to ">
|
||||
<meta name="generator" content="docfx 2.24.0.0">
|
||||
<meta name="generator" content="docfx 2.45.1.0">
|
||||
|
||||
<link rel="shortcut icon" href="favicon.ico">
|
||||
<link rel="stylesheet" href="styles/docfx.vendor.css">
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
|
||||
</head>
|
||||
<body data-spy="scroll" data-target="#affix">
|
||||
<body data-spy="scroll" data-target="#affix" data-offset="120">
|
||||
<div id="wrapper">
|
||||
<header>
|
||||
|
||||
@ -117,7 +117,7 @@
|
||||
<a href="#top">Back to top</a>
|
||||
</span>
|
||||
|
||||
<span>Copyright © 2015-2017 Microsoft<br>Generated by <strong>DocFX</strong></span>
|
||||
<span>Generated by <strong>DocFX</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
465
manifest.json
465
manifest.json
@ -1,270 +1,197 @@
|
||||
{
|
||||
"homepages": [],
|
||||
"source_base_path": "C:/projects/openiddict-documentation",
|
||||
"xrefmap": "xrefmap.yml",
|
||||
"files": [
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "configuration/application-permissions.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "configuration/application-permissions.html",
|
||||
"hash": "y78P3+7bCwRlnNtXWh2z6g=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "configuration/index.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "configuration/index.html",
|
||||
"hash": "qF3RmMBpfcXNp5Ejs0whhQ=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Toc",
|
||||
"source_relative_path": "configuration/toc.yml",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "configuration/toc.html",
|
||||
"hash": "m67AAcKiDQVnxBgYAmTIUA=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "configuration/token-setup-and-validation.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "configuration/token-setup-and-validation.html",
|
||||
"hash": "j2Rd3f4apImdla2dwzMPGA=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "docfx.console.2.24.0/content/api/index.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "docfx.console.2.24.0/content/api/index.html",
|
||||
"hash": "vZUtKskqnVmuRNs2Sv+lQw=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "docfx.console.2.24.0/content/articles/intro.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "docfx.console.2.24.0/content/articles/intro.html",
|
||||
"hash": "bpZc6vqcbT8cJX1mlpAwrA=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Toc",
|
||||
"source_relative_path": "docfx.console.2.24.0/content/articles/toc.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "docfx.console.2.24.0/content/articles/toc.html",
|
||||
"hash": "D6rx80VNLRiYQhvcoPk0qg=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "docfx.console.2.24.0/content/index.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "docfx.console.2.24.0/content/index.html",
|
||||
"hash": "qLnUmlcAcyotqfgMLQkzPA=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Toc",
|
||||
"source_relative_path": "docfx.console.2.24.0/content/toc.yml",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "docfx.console.2.24.0/content/toc.html",
|
||||
"hash": "VOi3U8ZNGP3eCu8ta3j8ng=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Resource",
|
||||
"source_relative_path": "docfx.console.2.24.0/tools/docfx.exe",
|
||||
"output": {
|
||||
"resource": {
|
||||
"relative_path": "docfx.console.2.24.0/tools/docfx.exe"
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "guide/getting-started.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "guide/getting-started.html",
|
||||
"hash": "0wyHg87zimUQBVUd+YBcoA=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "guide/index.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "guide/index.html",
|
||||
"hash": "FEynGkc7zbVVh2fc3DBf8Q=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "guide/migration.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "guide/migration.html",
|
||||
"hash": "pPtuiMkHHvw3DJVajS8QSw=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "guide/samples.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "guide/samples.html",
|
||||
"hash": "KV9on+AGPqCnWLmPoBs8iQ=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Toc",
|
||||
"source_relative_path": "guide/toc.yml",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "guide/toc.html",
|
||||
"hash": "dFaJd5/AdBmX/LsgzYS1cg=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "guide/token-formats.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "guide/token-formats.html",
|
||||
"hash": "8OgSEbqbIVV4B7bdPzjVeQ=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "index.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "index.html",
|
||||
"hash": "1YD9m73tKl+jRwB6uIAnVg=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Toc",
|
||||
"source_relative_path": "toc.yml",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "toc.html",
|
||||
"hash": "8zBbcxLrM9ZNbv/ISAzFcQ=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
}
|
||||
],
|
||||
"incremental_info": [
|
||||
{
|
||||
"status": {
|
||||
"can_incremental": false,
|
||||
"details": "Cannot build incrementally because last build info is missing.",
|
||||
"incrementalPhase": "build"
|
||||
},
|
||||
"processors": {
|
||||
"RestApiDocumentProcessor": {
|
||||
"can_incremental": false,
|
||||
"details": "Processor RestApiDocumentProcessor cannot suppport incremental build because the processor doesn't implement ISupportIncrementalDocumentProcessor interface.",
|
||||
"incrementalPhase": "build"
|
||||
},
|
||||
"ConceptualDocumentProcessor": {
|
||||
"can_incremental": false,
|
||||
"incrementalPhase": "build"
|
||||
},
|
||||
"ManagedReferenceDocumentProcessor": {
|
||||
"can_incremental": false,
|
||||
"incrementalPhase": "build"
|
||||
},
|
||||
"ResourceDocumentProcessor": {
|
||||
"can_incremental": false,
|
||||
"details": "Processor ResourceDocumentProcessor cannot suppport incremental build because the processor doesn't implement ISupportIncrementalDocumentProcessor interface.",
|
||||
"incrementalPhase": "build"
|
||||
},
|
||||
"TocDocumentProcessor": {
|
||||
"can_incremental": false,
|
||||
"details": "Processor TocDocumentProcessor cannot suppport incremental build because the processor doesn't implement ISupportIncrementalDocumentProcessor interface.",
|
||||
"incrementalPhase": "build"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"status": {
|
||||
"can_incremental": false,
|
||||
"details": "Cannot support incremental post processing, the reason is: last post processor info is null.",
|
||||
"incrementalPhase": "postProcessing"
|
||||
},
|
||||
"processors": {}
|
||||
}
|
||||
],
|
||||
"version_info": {},
|
||||
"groups": [
|
||||
{
|
||||
"xrefmap": "xrefmap.yml"
|
||||
}
|
||||
]
|
||||
{
|
||||
"homepages": [],
|
||||
"source_base_path": "/github/workspace",
|
||||
"xrefmap": "xrefmap.yml",
|
||||
"files": [
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "configuration/application-permissions.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "configuration/application-permissions.html",
|
||||
"hash": "unaFZIma6NrKTD1qHZhccw=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "configuration/index.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "configuration/index.html",
|
||||
"hash": "ORDiSiwLuj/qCUldUDq8iw=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Toc",
|
||||
"source_relative_path": "configuration/toc.yml",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "configuration/toc.html",
|
||||
"hash": "wpuOXWR08LMoFmhQp3UJ8A=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "configuration/token-setup-and-validation.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "configuration/token-setup-and-validation.html",
|
||||
"hash": "SqJ9vgWiX+R1OUhK60ML1A=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "guide/getting-started.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "guide/getting-started.html",
|
||||
"hash": "g+HGy8TAzkc07i36wiH2xA=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "guide/index.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "guide/index.html",
|
||||
"hash": "TI0h+gKANjcFilPg8eAY/w=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "guide/migration.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "guide/migration.html",
|
||||
"hash": "RQ6Gwlu3/Xx7HtX9QQZJrw=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "guide/samples.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "guide/samples.html",
|
||||
"hash": "D5fWr71Gsrw7X9GGeRL9yg=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Toc",
|
||||
"source_relative_path": "guide/toc.yml",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "guide/toc.html",
|
||||
"hash": "XybmKrpykKDovVa+x2xtXw=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"log_codes": [
|
||||
"InvalidYamlHeader"
|
||||
],
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "guide/token-formats.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "guide/token-formats.html",
|
||||
"hash": "8gY7U3PXs/cOqFNSN0Y3Ow=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Conceptual",
|
||||
"source_relative_path": "index.md",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "index.html",
|
||||
"hash": "dZimbO+BmDcqNM1XH/SYWw=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
},
|
||||
{
|
||||
"type": "Toc",
|
||||
"source_relative_path": "toc.yml",
|
||||
"output": {
|
||||
".html": {
|
||||
"relative_path": "toc.html",
|
||||
"hash": "Pu3USoXIgM2Rr0Z6lnld9A=="
|
||||
}
|
||||
},
|
||||
"is_incremental": false,
|
||||
"version": ""
|
||||
}
|
||||
],
|
||||
"incremental_info": [
|
||||
{
|
||||
"status": {
|
||||
"can_incremental": false,
|
||||
"details": "Cannot build incrementally because last build info is missing.",
|
||||
"incrementalPhase": "build",
|
||||
"total_file_count": 0,
|
||||
"skipped_file_count": 0,
|
||||
"full_build_reason_code": "NoAvailableBuildCache"
|
||||
},
|
||||
"processors": {
|
||||
"TocDocumentProcessor": {
|
||||
"can_incremental": false,
|
||||
"details": "Processor TocDocumentProcessor cannot support incremental build because the processor doesn't implement ISupportIncrementalDocumentProcessor interface.",
|
||||
"incrementalPhase": "build",
|
||||
"total_file_count": 0,
|
||||
"skipped_file_count": 0
|
||||
},
|
||||
"ConceptualDocumentProcessor": {
|
||||
"can_incremental": false,
|
||||
"incrementalPhase": "build",
|
||||
"total_file_count": 9,
|
||||
"skipped_file_count": 0
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"status": {
|
||||
"can_incremental": false,
|
||||
"details": "Cannot support incremental post processing, the reason is: last post processor info is null.",
|
||||
"incrementalPhase": "postProcessing",
|
||||
"total_file_count": 0,
|
||||
"skipped_file_count": 0
|
||||
},
|
||||
"processors": {}
|
||||
}
|
||||
],
|
||||
"version_info": {},
|
||||
"groups": [
|
||||
{
|
||||
"xrefmap": "xrefmap.yml"
|
||||
}
|
||||
]
|
||||
}
|
@ -23,20 +23,6 @@ a.disable:hover {
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
/* workaround for leave space for fixed navbar with # anchor url*/
|
||||
|
||||
h1:before,
|
||||
h2:before,
|
||||
h3:before,
|
||||
h4:before {
|
||||
content: '';
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 0;
|
||||
height: 100px;
|
||||
margin-top: -100px;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6, .text-break {
|
||||
word-wrap: break-word;
|
||||
word-break: break-word;
|
||||
@ -120,6 +106,12 @@ table p {
|
||||
table a {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
/* Make hidden attribute compatible with old browser.*/
|
||||
[hidden] {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
h1,
|
||||
.h1,
|
||||
h2,
|
||||
@ -362,6 +354,28 @@ article section {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#search-results p .index-loading {
|
||||
animation: index-loading 1.5s infinite linear;
|
||||
-webkit-animation: index-loading 1.5s infinite linear;
|
||||
-o-animation: index-loading 1.5s infinite linear;
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
|
||||
@keyframes index-loading {
|
||||
from { transform: scale(1) rotate(0deg);}
|
||||
to { transform: scale(1) rotate(360deg);}
|
||||
}
|
||||
|
||||
@-webkit-keyframes index-loading {
|
||||
from { -webkit-transform: rotate(0deg);}
|
||||
to { -webkit-transform: rotate(360deg);}
|
||||
}
|
||||
|
||||
@-o-keyframes index-loading {
|
||||
from { -o-transform: rotate(0deg);}
|
||||
to { -o-transform: rotate(360deg);}
|
||||
}
|
||||
|
||||
#search-results .sr-items {
|
||||
font-size: 24px;
|
||||
}
|
||||
@ -618,7 +632,6 @@ body .toc{
|
||||
overflow: hidden;
|
||||
padding-bottom: 10px;
|
||||
height: calc(100% - 100px);
|
||||
margin-right: -20px;
|
||||
}
|
||||
.affix ul > li > a:before {
|
||||
color: #cccccc;
|
||||
@ -892,4 +905,52 @@ div.embeddedvideo iframe {
|
||||
.footer {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* For tabbed content */
|
||||
|
||||
.tabGroup {
|
||||
margin-top: 1rem; }
|
||||
.tabGroup ul[role="tablist"] {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none; }
|
||||
.tabGroup ul[role="tablist"] > li {
|
||||
list-style: none;
|
||||
display: inline-block; }
|
||||
.tabGroup a[role="tab"] {
|
||||
color: #6e6e6e;
|
||||
box-sizing: border-box;
|
||||
display: inline-block;
|
||||
padding: 5px 7.5px;
|
||||
text-decoration: none;
|
||||
border-bottom: 2px solid #fff; }
|
||||
.tabGroup a[role="tab"]:hover, .tabGroup a[role="tab"]:focus, .tabGroup a[role="tab"][aria-selected="true"] {
|
||||
border-bottom: 2px solid #0050C5; }
|
||||
.tabGroup a[role="tab"][aria-selected="true"] {
|
||||
color: #222; }
|
||||
.tabGroup a[role="tab"]:hover, .tabGroup a[role="tab"]:focus {
|
||||
color: #0050C5; }
|
||||
.tabGroup a[role="tab"]:focus {
|
||||
outline: 1px solid #0050C5;
|
||||
outline-offset: -1px; }
|
||||
@media (min-width: 768px) {
|
||||
.tabGroup a[role="tab"] {
|
||||
padding: 5px 15px; } }
|
||||
.tabGroup section[role="tabpanel"] {
|
||||
border: 1px solid #e0e0e0;
|
||||
padding: 15px;
|
||||
margin: 0;
|
||||
overflow: hidden; }
|
||||
.tabGroup section[role="tabpanel"] > .codeHeader,
|
||||
.tabGroup section[role="tabpanel"] > pre {
|
||||
margin-left: -16px;
|
||||
margin-right: -16px; }
|
||||
.tabGroup section[role="tabpanel"] > :first-child {
|
||||
margin-top: 0; }
|
||||
.tabGroup section[role="tabpanel"] > pre:last-child {
|
||||
display: block;
|
||||
margin-bottom: -16px; }
|
||||
|
||||
.mainContainer[dir='rtl'] main ul[role="tablist"] {
|
||||
margin: 0; }
|
||||
|
530
styles/docfx.js
530
styles/docfx.js
@ -8,6 +8,7 @@ $(function () {
|
||||
var hide = 'hide';
|
||||
var util = new utility();
|
||||
|
||||
workAroundFixedHeaderForAnchors();
|
||||
highlight();
|
||||
enableSearch();
|
||||
|
||||
@ -21,6 +22,7 @@ $(function () {
|
||||
renderLogo();
|
||||
|
||||
breakText();
|
||||
renderTabs();
|
||||
|
||||
window.refresh = function (article) {
|
||||
// Update markup result
|
||||
@ -32,22 +34,24 @@ $(function () {
|
||||
renderTables();
|
||||
renderAlerts();
|
||||
renderAffix();
|
||||
renderTabs();
|
||||
}
|
||||
|
||||
// Add this event listener when needed
|
||||
// window.addEventListener('content-update', contentUpdate);
|
||||
|
||||
function breakText() {
|
||||
$(".xref").addClass("text-break");
|
||||
var texts = $(".text-break");
|
||||
texts.each(function () {
|
||||
$(this).text(function (index, text) {
|
||||
return util.breakText(text);
|
||||
})
|
||||
$(this).breakWord();
|
||||
});
|
||||
}
|
||||
|
||||
// Styling for tables in conceptual documents using Bootstrap.
|
||||
// See http://getbootstrap.com/css/#tables
|
||||
function renderTables() {
|
||||
$('table').addClass('table table-bordered table-striped table-condensed');
|
||||
$('table').addClass('table table-bordered table-striped table-condensed').wrap('<div class=\"table-responsive\"></div>');
|
||||
}
|
||||
|
||||
// Styling for alerts.
|
||||
@ -180,7 +184,7 @@ $(function () {
|
||||
}
|
||||
searchData = JSON.parse(this.responseText);
|
||||
for (var prop in searchData) {
|
||||
if (searchData.hasOwnProperty(prop)){
|
||||
if (searchData.hasOwnProperty(prop)) {
|
||||
lunrIndex.add(searchData[prop]);
|
||||
}
|
||||
}
|
||||
@ -219,6 +223,9 @@ $(function () {
|
||||
$("body").bind("queryReady", function () {
|
||||
worker.postMessage({ q: query });
|
||||
});
|
||||
if (query && (query.length >= 3)) {
|
||||
worker.postMessage({ q: query });
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -340,6 +347,14 @@ $(function () {
|
||||
} else {
|
||||
$('#navbar ul a.active').parents('li').addClass(active);
|
||||
renderBreadcrumb();
|
||||
showSearch();
|
||||
}
|
||||
|
||||
function showSearch() {
|
||||
if ($('#search-results').length !== 0) {
|
||||
$('#search').show();
|
||||
$('body').trigger("searchEvent");
|
||||
}
|
||||
}
|
||||
|
||||
function loadNavbar() {
|
||||
@ -352,10 +367,7 @@ $(function () {
|
||||
if (tocPath) tocPath = tocPath.replace(/\\/g, '/');
|
||||
$.get(navbarPath, function (data) {
|
||||
$(data).find("#toc>ul").appendTo("#navbar");
|
||||
if ($('#search-results').length !== 0) {
|
||||
$('#search').show();
|
||||
$('body').trigger("searchEvent");
|
||||
}
|
||||
showSearch();
|
||||
var index = navbarPath.lastIndexOf('/');
|
||||
var navrel = '';
|
||||
if (index > -1) {
|
||||
@ -370,7 +382,6 @@ $(function () {
|
||||
href = navrel + href;
|
||||
$(e).attr("href", href);
|
||||
|
||||
// TODO: currently only support one level navbar
|
||||
var isActive = false;
|
||||
var originalHref = e.name;
|
||||
if (originalHref) {
|
||||
@ -380,7 +391,10 @@ $(function () {
|
||||
}
|
||||
} else {
|
||||
if (util.getAbsolutePath(href) === currentAbsPath) {
|
||||
isActive = true;
|
||||
var dropdown = $(e).attr('data-toggle') == "dropdown"
|
||||
if (!dropdown) {
|
||||
isActive = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isActive) {
|
||||
@ -470,7 +484,7 @@ $(function () {
|
||||
|
||||
function filterNavItem(name, text) {
|
||||
if (!text) return true;
|
||||
if (name.toLowerCase().indexOf(text.toLowerCase()) > -1) return true;
|
||||
if (name && name.toLowerCase().indexOf(text.toLowerCase()) > -1) return true;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
@ -500,9 +514,7 @@ $(function () {
|
||||
$(e).addClass(active);
|
||||
}
|
||||
|
||||
$(e).text(function (index, text) {
|
||||
return util.breakText(text);
|
||||
})
|
||||
$(e).breakWord();
|
||||
});
|
||||
|
||||
renderSidebar();
|
||||
@ -532,84 +544,86 @@ $(function () {
|
||||
//Setup Affix
|
||||
function renderAffix() {
|
||||
var hierarchy = getHierarchy();
|
||||
if (hierarchy.length > 0) {
|
||||
if (hierarchy && hierarchy.length > 0) {
|
||||
var html = '<h5 class="title">In This Article</h5>'
|
||||
html += util.formList(hierarchy, ['nav', 'bs-docs-sidenav']);
|
||||
$("#affix").empty().append(html);
|
||||
if ($('footer').is(':visible')) {
|
||||
$(".sideaffix").css("bottom", "70px");
|
||||
}
|
||||
$('#affix').on('activate.bs.scrollspy', function (e) {
|
||||
if (e.target) {
|
||||
if ($(e.target).find('li.active').length > 0) {
|
||||
return;
|
||||
}
|
||||
var top = $(e.target).position().top;
|
||||
$(e.target).parents('li').each(function (i, e) {
|
||||
top += $(e).position().top;
|
||||
});
|
||||
var container = $('#affix > ul');
|
||||
var height = container.height();
|
||||
container.scrollTop(container.scrollTop() + top - height / 2);
|
||||
$('#affix a').click(function(e) {
|
||||
var scrollspy = $('[data-spy="scroll"]').data()['bs.scrollspy'];
|
||||
var target = e.target.hash;
|
||||
if (scrollspy && target) {
|
||||
scrollspy.activate(target);
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
function getHierarchy() {
|
||||
// supported headers are h1, h2, h3, and h4
|
||||
// The topest header is ignored
|
||||
var selector = ".article article";
|
||||
var affixSelector = "#affix";
|
||||
var headers = ['h4', 'h3', 'h2', 'h1'];
|
||||
var hierarchy = [];
|
||||
var toppestIndex = -1;
|
||||
var startIndex = -1;
|
||||
// 1. get header hierarchy
|
||||
for (var i = headers.length - 1; i >= 0; i--) {
|
||||
var header = $(selector + " " + headers[i]);
|
||||
var length = header.length;
|
||||
var $headers = $($.map(['h1', 'h2', 'h3', 'h4'], function (h) { return ".article article " + h; }).join(", "));
|
||||
|
||||
// If contains no header in current selector, find the next one
|
||||
if (length === 0) continue;
|
||||
|
||||
// If the toppest header contains only one item, e.g. title, ignore
|
||||
if (length === 1 && hierarchy.length === 0 && toppestIndex < 0) {
|
||||
toppestIndex = i;
|
||||
continue;
|
||||
// a stack of hierarchy items that are currently being built
|
||||
var stack = [];
|
||||
$headers.each(function (i, e) {
|
||||
if (!e.id) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Get second level children
|
||||
var nextLevelSelector = i > 0 ? headers[i - 1] : null;
|
||||
var prevSelector;
|
||||
for (var j = length - 1; j >= 0; j--) {
|
||||
var e = header[j];
|
||||
var id = e.id;
|
||||
if (!id) continue; // For affix, id is a must-have
|
||||
var item = {
|
||||
name: htmlEncode($(e).text()),
|
||||
href: "#" + id,
|
||||
items: []
|
||||
};
|
||||
if (nextLevelSelector) {
|
||||
var selector = '#' + cssEscape(id) + "~" + nextLevelSelector;
|
||||
var currentSelector = selector;
|
||||
if (prevSelector) currentSelector += ":not(" + prevSelector + ")";
|
||||
$(header[j]).siblings(currentSelector).each(function (index, e) {
|
||||
if (e.id) {
|
||||
item.items.push({
|
||||
name: htmlEncode($(e).text()), // innerText decodes text while innerHTML not
|
||||
href: "#" + e.id
|
||||
})
|
||||
}
|
||||
})
|
||||
prevSelector = selector;
|
||||
var item = {
|
||||
name: htmlEncode($(e).text()),
|
||||
href: "#" + e.id,
|
||||
items: []
|
||||
};
|
||||
|
||||
if (!stack.length) {
|
||||
stack.push({ type: e.tagName, siblings: [item] });
|
||||
return;
|
||||
}
|
||||
|
||||
var frame = stack[stack.length - 1];
|
||||
if (e.tagName === frame.type) {
|
||||
frame.siblings.push(item);
|
||||
} else if (e.tagName[1] > frame.type[1]) {
|
||||
// we are looking at a child of the last element of frame.siblings.
|
||||
// push a frame onto the stack. After we've finished building this item's children,
|
||||
// we'll attach it as a child of the last element
|
||||
stack.push({ type: e.tagName, siblings: [item] });
|
||||
} else { // e.tagName[1] < frame.type[1]
|
||||
// we are looking at a sibling of an ancestor of the current item.
|
||||
// pop frames from the stack, building items as we go, until we reach the correct level at which to attach this item.
|
||||
while (e.tagName[1] < stack[stack.length - 1].type[1]) {
|
||||
buildParent();
|
||||
}
|
||||
if (e.tagName === stack[stack.length - 1].type) {
|
||||
stack[stack.length - 1].siblings.push(item);
|
||||
} else {
|
||||
stack.push({ type: e.tagName, siblings: [item] });
|
||||
}
|
||||
hierarchy.push(item);
|
||||
}
|
||||
break;
|
||||
};
|
||||
hierarchy.reverse();
|
||||
return hierarchy;
|
||||
});
|
||||
while (stack.length > 1) {
|
||||
buildParent();
|
||||
}
|
||||
|
||||
function buildParent() {
|
||||
var childrenToAttach = stack.pop();
|
||||
var parentFrame = stack[stack.length - 1];
|
||||
var parent = parentFrame.siblings[parentFrame.siblings.length - 1];
|
||||
$.each(childrenToAttach.siblings, function (i, child) {
|
||||
parent.items.push(child);
|
||||
});
|
||||
}
|
||||
if (stack.length > 0) {
|
||||
|
||||
var topLevel = stack.pop().siblings;
|
||||
if (topLevel.length === 1) { // if there's only one topmost header, dump it
|
||||
return topLevel[0].items;
|
||||
}
|
||||
return topLevel;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function htmlEncode(str) {
|
||||
@ -715,13 +729,277 @@ $(function () {
|
||||
});
|
||||
}
|
||||
|
||||
function renderTabs() {
|
||||
var contentAttrs = {
|
||||
id: 'data-bi-id',
|
||||
name: 'data-bi-name',
|
||||
type: 'data-bi-type'
|
||||
};
|
||||
|
||||
var Tab = (function () {
|
||||
function Tab(li, a, section) {
|
||||
this.li = li;
|
||||
this.a = a;
|
||||
this.section = section;
|
||||
}
|
||||
Object.defineProperty(Tab.prototype, "tabIds", {
|
||||
get: function () { return this.a.getAttribute('data-tab').split(' '); },
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
});
|
||||
Object.defineProperty(Tab.prototype, "condition", {
|
||||
get: function () { return this.a.getAttribute('data-condition'); },
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
});
|
||||
Object.defineProperty(Tab.prototype, "visible", {
|
||||
get: function () { return !this.li.hasAttribute('hidden'); },
|
||||
set: function (value) {
|
||||
if (value) {
|
||||
this.li.removeAttribute('hidden');
|
||||
this.li.removeAttribute('aria-hidden');
|
||||
}
|
||||
else {
|
||||
this.li.setAttribute('hidden', 'hidden');
|
||||
this.li.setAttribute('aria-hidden', 'true');
|
||||
}
|
||||
},
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
});
|
||||
Object.defineProperty(Tab.prototype, "selected", {
|
||||
get: function () { return !this.section.hasAttribute('hidden'); },
|
||||
set: function (value) {
|
||||
if (value) {
|
||||
this.a.setAttribute('aria-selected', 'true');
|
||||
this.a.tabIndex = 0;
|
||||
this.section.removeAttribute('hidden');
|
||||
this.section.removeAttribute('aria-hidden');
|
||||
}
|
||||
else {
|
||||
this.a.setAttribute('aria-selected', 'false');
|
||||
this.a.tabIndex = -1;
|
||||
this.section.setAttribute('hidden', 'hidden');
|
||||
this.section.setAttribute('aria-hidden', 'true');
|
||||
}
|
||||
},
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
});
|
||||
Tab.prototype.focus = function () {
|
||||
this.a.focus();
|
||||
};
|
||||
return Tab;
|
||||
}());
|
||||
|
||||
initTabs(document.body);
|
||||
|
||||
function initTabs(container) {
|
||||
var queryStringTabs = readTabsQueryStringParam();
|
||||
var elements = container.querySelectorAll('.tabGroup');
|
||||
var state = { groups: [], selectedTabs: [] };
|
||||
for (var i = 0; i < elements.length; i++) {
|
||||
var group = initTabGroup(elements.item(i));
|
||||
if (!group.independent) {
|
||||
updateVisibilityAndSelection(group, state);
|
||||
state.groups.push(group);
|
||||
}
|
||||
}
|
||||
container.addEventListener('click', function (event) { return handleClick(event, state); });
|
||||
if (state.groups.length === 0) {
|
||||
return state;
|
||||
}
|
||||
selectTabs(queryStringTabs, container);
|
||||
updateTabsQueryStringParam(state);
|
||||
notifyContentUpdated();
|
||||
return state;
|
||||
}
|
||||
|
||||
function initTabGroup(element) {
|
||||
var group = {
|
||||
independent: element.hasAttribute('data-tab-group-independent'),
|
||||
tabs: []
|
||||
};
|
||||
var li = element.firstElementChild.firstElementChild;
|
||||
while (li) {
|
||||
var a = li.firstElementChild;
|
||||
a.setAttribute(contentAttrs.name, 'tab');
|
||||
var dataTab = a.getAttribute('data-tab').replace(/\+/g, ' ');
|
||||
a.setAttribute('data-tab', dataTab);
|
||||
var section = element.querySelector("[id=\"" + a.getAttribute('aria-controls') + "\"]");
|
||||
var tab = new Tab(li, a, section);
|
||||
group.tabs.push(tab);
|
||||
li = li.nextElementSibling;
|
||||
}
|
||||
element.setAttribute(contentAttrs.name, 'tab-group');
|
||||
element.tabGroup = group;
|
||||
return group;
|
||||
}
|
||||
|
||||
function updateVisibilityAndSelection(group, state) {
|
||||
var anySelected = false;
|
||||
var firstVisibleTab;
|
||||
for (var _i = 0, _a = group.tabs; _i < _a.length; _i++) {
|
||||
var tab = _a[_i];
|
||||
tab.visible = tab.condition === null || state.selectedTabs.indexOf(tab.condition) !== -1;
|
||||
if (tab.visible) {
|
||||
if (!firstVisibleTab) {
|
||||
firstVisibleTab = tab;
|
||||
}
|
||||
}
|
||||
tab.selected = tab.visible && arraysIntersect(state.selectedTabs, tab.tabIds);
|
||||
anySelected = anySelected || tab.selected;
|
||||
}
|
||||
if (!anySelected) {
|
||||
for (var _b = 0, _c = group.tabs; _b < _c.length; _b++) {
|
||||
var tabIds = _c[_b].tabIds;
|
||||
for (var _d = 0, tabIds_1 = tabIds; _d < tabIds_1.length; _d++) {
|
||||
var tabId = tabIds_1[_d];
|
||||
var index = state.selectedTabs.indexOf(tabId);
|
||||
if (index === -1) {
|
||||
continue;
|
||||
}
|
||||
state.selectedTabs.splice(index, 1);
|
||||
}
|
||||
}
|
||||
var tab = firstVisibleTab;
|
||||
tab.selected = true;
|
||||
state.selectedTabs.push(tab.tabIds[0]);
|
||||
}
|
||||
}
|
||||
|
||||
function getTabInfoFromEvent(event) {
|
||||
if (!(event.target instanceof HTMLElement)) {
|
||||
return null;
|
||||
}
|
||||
var anchor = event.target.closest('a[data-tab]');
|
||||
if (anchor === null) {
|
||||
return null;
|
||||
}
|
||||
var tabIds = anchor.getAttribute('data-tab').split(' ');
|
||||
var group = anchor.parentElement.parentElement.parentElement.tabGroup;
|
||||
if (group === undefined) {
|
||||
return null;
|
||||
}
|
||||
return { tabIds: tabIds, group: group, anchor: anchor };
|
||||
}
|
||||
|
||||
function handleClick(event, state) {
|
||||
var info = getTabInfoFromEvent(event);
|
||||
if (info === null) {
|
||||
return;
|
||||
}
|
||||
event.preventDefault();
|
||||
info.anchor.href = 'javascript:';
|
||||
setTimeout(function () { return info.anchor.href = '#' + info.anchor.getAttribute('aria-controls'); });
|
||||
var tabIds = info.tabIds, group = info.group;
|
||||
var originalTop = info.anchor.getBoundingClientRect().top;
|
||||
if (group.independent) {
|
||||
for (var _i = 0, _a = group.tabs; _i < _a.length; _i++) {
|
||||
var tab = _a[_i];
|
||||
tab.selected = arraysIntersect(tab.tabIds, tabIds);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (arraysIntersect(state.selectedTabs, tabIds)) {
|
||||
return;
|
||||
}
|
||||
var previousTabId = group.tabs.filter(function (t) { return t.selected; })[0].tabIds[0];
|
||||
state.selectedTabs.splice(state.selectedTabs.indexOf(previousTabId), 1, tabIds[0]);
|
||||
for (var _b = 0, _c = state.groups; _b < _c.length; _b++) {
|
||||
var group_1 = _c[_b];
|
||||
updateVisibilityAndSelection(group_1, state);
|
||||
}
|
||||
updateTabsQueryStringParam(state);
|
||||
}
|
||||
notifyContentUpdated();
|
||||
var top = info.anchor.getBoundingClientRect().top;
|
||||
if (top !== originalTop && event instanceof MouseEvent) {
|
||||
window.scrollTo(0, window.pageYOffset + top - originalTop);
|
||||
}
|
||||
}
|
||||
|
||||
function selectTabs(tabIds) {
|
||||
for (var _i = 0, tabIds_1 = tabIds; _i < tabIds_1.length; _i++) {
|
||||
var tabId = tabIds_1[_i];
|
||||
var a = document.querySelector(".tabGroup > ul > li > a[data-tab=\"" + tabId + "\"]:not([hidden])");
|
||||
if (a === null) {
|
||||
return;
|
||||
}
|
||||
a.dispatchEvent(new CustomEvent('click', { bubbles: true }));
|
||||
}
|
||||
}
|
||||
|
||||
function readTabsQueryStringParam() {
|
||||
var qs = parseQueryString();
|
||||
var t = qs.tabs;
|
||||
if (t === undefined || t === '') {
|
||||
return [];
|
||||
}
|
||||
return t.split(',');
|
||||
}
|
||||
|
||||
function updateTabsQueryStringParam(state) {
|
||||
var qs = parseQueryString();
|
||||
qs.tabs = state.selectedTabs.join();
|
||||
var url = location.protocol + "//" + location.host + location.pathname + "?" + toQueryString(qs) + location.hash;
|
||||
if (location.href === url) {
|
||||
return;
|
||||
}
|
||||
history.replaceState({}, document.title, url);
|
||||
}
|
||||
|
||||
function toQueryString(args) {
|
||||
var parts = [];
|
||||
for (var name_1 in args) {
|
||||
if (args.hasOwnProperty(name_1) && args[name_1] !== '' && args[name_1] !== null && args[name_1] !== undefined) {
|
||||
parts.push(encodeURIComponent(name_1) + '=' + encodeURIComponent(args[name_1]));
|
||||
}
|
||||
}
|
||||
return parts.join('&');
|
||||
}
|
||||
|
||||
function parseQueryString(queryString) {
|
||||
var match;
|
||||
var pl = /\+/g;
|
||||
var search = /([^&=]+)=?([^&]*)/g;
|
||||
var decode = function (s) { return decodeURIComponent(s.replace(pl, ' ')); };
|
||||
if (queryString === undefined) {
|
||||
queryString = '';
|
||||
}
|
||||
queryString = queryString.substring(1);
|
||||
var urlParams = {};
|
||||
while (match = search.exec(queryString)) {
|
||||
urlParams[decode(match[1])] = decode(match[2]);
|
||||
}
|
||||
return urlParams;
|
||||
}
|
||||
|
||||
function arraysIntersect(a, b) {
|
||||
for (var _i = 0, a_1 = a; _i < a_1.length; _i++) {
|
||||
var itemA = a_1[_i];
|
||||
for (var _a = 0, b_1 = b; _a < b_1.length; _a++) {
|
||||
var itemB = b_1[_a];
|
||||
if (itemA === itemB) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function notifyContentUpdated() {
|
||||
// Dispatch this event when needed
|
||||
// window.dispatchEvent(new CustomEvent('content-update'));
|
||||
}
|
||||
}
|
||||
|
||||
function utility() {
|
||||
this.getAbsolutePath = getAbsolutePath;
|
||||
this.isRelativePath = isRelativePath;
|
||||
this.isAbsolutePath = isAbsolutePath;
|
||||
this.getDirectory = getDirectory;
|
||||
this.formList = formList;
|
||||
this.breakText = breakText;
|
||||
|
||||
function getAbsolutePath(href) {
|
||||
// Use anchor to normalize href
|
||||
@ -731,6 +1009,9 @@ $(function () {
|
||||
}
|
||||
|
||||
function isRelativePath(href) {
|
||||
if (href === undefined || href === '' || href[0] === '/') {
|
||||
return false;
|
||||
}
|
||||
return !isAbsolutePath(href);
|
||||
}
|
||||
|
||||
@ -747,7 +1028,6 @@ $(function () {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function formList(item, classes) {
|
||||
var level = 1;
|
||||
var model = {
|
||||
@ -776,9 +1056,95 @@ $(function () {
|
||||
}
|
||||
}
|
||||
|
||||
function breakText(text) {
|
||||
/**
|
||||
* Add <wbr> into long word.
|
||||
* @param {String} text - The word to break. It should be in plain text without HTML tags.
|
||||
*/
|
||||
function breakPlainText(text) {
|
||||
if (!text) return text;
|
||||
return text.replace(/([a-z])([A-Z])|(\.)(\w)/g, '$1$3\u200B$2$4')
|
||||
return text.replace(/([a-z])([A-Z])|(\.)(\w)/g, '$1$3<wbr>$2$4')
|
||||
}
|
||||
|
||||
/**
|
||||
* Add <wbr> into long word. The jQuery element should contain no html tags.
|
||||
* If the jQuery element contains tags, this function will not change the element.
|
||||
*/
|
||||
$.fn.breakWord = function () {
|
||||
if (this.html() == this.text()) {
|
||||
this.html(function (index, text) {
|
||||
return breakPlainText(text);
|
||||
})
|
||||
}
|
||||
return this;
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
// adjusted from https://stackoverflow.com/a/13067009/1523776
|
||||
function workAroundFixedHeaderForAnchors() {
|
||||
var HISTORY_SUPPORT = !!(history && history.pushState);
|
||||
var ANCHOR_REGEX = /^#[^ ]+$/;
|
||||
|
||||
function getFixedOffset() {
|
||||
return $('header').first().height();
|
||||
}
|
||||
|
||||
/**
|
||||
* If the provided href is an anchor which resolves to an element on the
|
||||
* page, scroll to it.
|
||||
* @param {String} href
|
||||
* @return {Boolean} - Was the href an anchor.
|
||||
*/
|
||||
function scrollIfAnchor(href, pushToHistory) {
|
||||
var match, rect, anchorOffset;
|
||||
|
||||
if (!ANCHOR_REGEX.test(href)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
match = document.getElementById(href.slice(1));
|
||||
|
||||
if (match) {
|
||||
rect = match.getBoundingClientRect();
|
||||
anchorOffset = window.pageYOffset + rect.top - getFixedOffset();
|
||||
window.scrollTo(window.pageXOffset, anchorOffset);
|
||||
|
||||
// Add the state to history as-per normal anchor links
|
||||
if (HISTORY_SUPPORT && pushToHistory) {
|
||||
history.pushState({}, document.title, location.pathname + href);
|
||||
}
|
||||
}
|
||||
|
||||
return !!match;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to scroll to the current location's hash.
|
||||
*/
|
||||
function scrollToCurrent() {
|
||||
scrollIfAnchor(window.location.hash);
|
||||
}
|
||||
|
||||
/**
|
||||
* If the click event's target was an anchor, fix the scroll position.
|
||||
*/
|
||||
function delegateAnchors(e) {
|
||||
var elem = e.target;
|
||||
|
||||
if (scrollIfAnchor(elem.getAttribute('href'), true)) {
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
$(window).on('hashchange', scrollToCurrent);
|
||||
|
||||
$(window).load(function () {
|
||||
// scroll to the anchor if present, offset by the header
|
||||
scrollToCurrent();
|
||||
});
|
||||
|
||||
$(document).ready(function () {
|
||||
// Exclude tabbed content case
|
||||
$('a:not([data-tab])').click(function (e) { delegateAnchors(e); });
|
||||
});
|
||||
}
|
||||
});
|
||||
|
@ -1451,16 +1451,14 @@ td.visible-print,th.visible-print{display:table-cell!important}
|
||||
@media print{.visible-print-inline-block{display:inline-block!important}
|
||||
.hidden-print{display:none!important}
|
||||
}
|
||||
.hljs{display:block;background:#fff;padding:.5em;color:#333;overflow-x:auto;-webkit-text-size-adjust:none}
|
||||
.bash .hljs-shebang,.hljs-comment,.java .hljs-javadoc,.javascript .hljs-javadoc,.rust .hljs-preprocessor{color:#969896}
|
||||
.apache .hljs-sqbracket,.c .hljs-preprocessor,.coffeescript .hljs-regexp,.coffeescript .hljs-subst,.cpp .hljs-preprocessor,.hljs-string,.javascript .hljs-regexp,.json .hljs-attribute,.less .hljs-built_in,.makefile .hljs-variable,.markdown .hljs-blockquote,.markdown .hljs-emphasis,.markdown .hljs-link_label,.markdown .hljs-strong,.markdown .hljs-value,.nginx .hljs-number,.nginx .hljs-regexp,.objectivec .hljs-preprocessor .hljs-title,.perl .hljs-regexp,.php .hljs-regexp,.scss .hljs-built_in,.xml .hljs-value{color:#df5000}
|
||||
.css .hljs-at_rule,.css .hljs-important,.go .hljs-typename,.haskell .hljs-type,.hljs-keyword,.http .hljs-request,.ini .hljs-setting,.java .hljs-javadoctag,.javascript .hljs-javadoctag,.javascript .hljs-tag,.less .hljs-at_rule,.less .hljs-tag,.nginx .hljs-title,.objectivec .hljs-preprocessor,.php .hljs-phpdoc,.scss .hljs-at_rule,.scss .hljs-important,.scss .hljs-tag,.sql .hljs-built_in,.stylus .hljs-at_rule,.swift .hljs-preprocessor{color:#a71d5d}
|
||||
.apache .hljs-cbracket,.apache .hljs-common,.apache .hljs-keyword,.bash .hljs-built_in,.bash .hljs-literal,.c .hljs-built_in,.c .hljs-number,.coffeescript .hljs-built_in,.coffeescript .hljs-literal,.coffeescript .hljs-number,.cpp .hljs-built_in,.cpp .hljs-number,.cs .hljs-built_in,.cs .hljs-number,.css .hljs-attribute,.css .hljs-function,.css .hljs-hexcolor,.css .hljs-number,.go .hljs-built_in,.go .hljs-constant,.haskell .hljs-number,.http .hljs-attribute,.http .hljs-literal,.java .hljs-number,.javascript .hljs-built_in,.javascript .hljs-literal,.javascript .hljs-number,.json .hljs-number,.less .hljs-attribute,.less .hljs-function,.less .hljs-hexcolor,.less .hljs-number,.makefile .hljs-keyword,.markdown .hljs-link_reference,.nginx .hljs-built_in,.objectivec .hljs-built_in,.objectivec .hljs-literal,.objectivec .hljs-number,.php .hljs-literal,.php .hljs-number,.puppet .hljs-function,.python .hljs-number,.ruby .hljs-constant,.ruby .hljs-number,.ruby .hljs-prompt,.ruby .hljs-subst .hljs-keyword,.ruby .hljs-symbol,.rust .hljs-number,.scss .hljs-attribute,.scss .hljs-function,.scss .hljs-hexcolor,.scss .hljs-number,.scss .hljs-preprocessor,.sql .hljs-number,.stylus .hljs-attribute,.stylus .hljs-hexcolor,.stylus .hljs-number,.stylus .hljs-params,.swift .hljs-built_in,.swift .hljs-number{color:#0086b3}
|
||||
.apache .hljs-tag,.cs .hljs-xmlDocTag,.css .hljs-tag,.stylus .hljs-tag,.xml .hljs-title{color:#63a35c}
|
||||
.bash .hljs-variable,.cs .hljs-preprocessor,.cs .hljs-preprocessor .hljs-keyword,.css .hljs-attr_selector,.css .hljs-value,.ini .hljs-keyword,.ini .hljs-value,.javascript .hljs-tag .hljs-title,.makefile .hljs-constant,.nginx .hljs-variable,.scss .hljs-variable,.xml .hljs-tag{color:#333}
|
||||
.bash .hljs-title,.c .hljs-title,.coffeescript .hljs-title,.cpp .hljs-title,.cs .hljs-title,.css .hljs-class,.css .hljs-id,.css .hljs-pseudo,.diff .hljs-chunk,.haskell .hljs-pragma,.haskell .hljs-title,.ini .hljs-title,.java .hljs-title,.javascript .hljs-title,.less .hljs-class,.less .hljs-id,.less .hljs-pseudo,.makefile .hljs-title,.objectivec .hljs-title,.perl .hljs-sub,.php .hljs-title,.puppet .hljs-title,.python .hljs-decorator,.python .hljs-title,.ruby .hljs-parent,.ruby .hljs-title,.rust .hljs-title,.scss .hljs-class,.scss .hljs-id,.scss .hljs-pseudo,.stylus .hljs-class,.stylus .hljs-id,.stylus .hljs-pseudo,.stylus .hljs-title,.swift .hljs-title,.xml .hljs-attribute{color:#795da3}
|
||||
.coffeescript .hljs-attribute,.coffeescript .hljs-reserved{color:#1d3e81}
|
||||
.diff .hljs-chunk{font-weight:700}
|
||||
.diff .hljs-addition{color:#55a532;background-color:#eaffea}
|
||||
.diff .hljs-deletion{color:#bd2c00;background-color:#ffecec}
|
||||
.markdown .hljs-link_url{text-decoration:underline}
|
||||
.hljs{display:block;background:#fff;padding:.5em;color:#333;overflow-x:auto}
|
||||
.hljs-comment,.hljs-meta{color:#969896}
|
||||
.hljs-emphasis,.hljs-quote,.hljs-string,.hljs-strong,.hljs-template-variable,.hljs-variable{color:#df5000}
|
||||
.hljs-keyword,.hljs-selector-tag,.hljs-type{color:#a71d5d}
|
||||
.hljs-attribute,.hljs-bullet,.hljs-literal,.hljs-symbol{color:#0086b3}
|
||||
.hljs-name,.hljs-section{color:#63a35c}
|
||||
.hljs-tag{color:#333}
|
||||
.hljs-attr,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-title{color:#795da3}
|
||||
.hljs-addition{color:#55a532;background-color:#eaffea}
|
||||
.hljs-deletion{color:#bd2c00;background-color:#ffecec}
|
||||
.hljs-link{text-decoration:underline}
|
File diff suppressed because one or more lines are too long
2
styles/lunr.min.js
vendored
2
styles/lunr.min.js
vendored
File diff suppressed because one or more lines are too long
@ -6,7 +6,7 @@
|
||||
var stopWords = null;
|
||||
var searchData = {};
|
||||
|
||||
lunr.tokenizer.seperator = /[\s\-\.]+/;
|
||||
lunr.tokenizer.separator = /[\s\-\.]+/;
|
||||
|
||||
var stopWordsRequest = new XMLHttpRequest();
|
||||
stopWordsRequest.open('GET', '../search-stopwords.json');
|
||||
|
115
toc.html
115
toc.html
@ -1,65 +1,4 @@
|
||||
<!DOCTYPE html>
|
||||
<!--[if IE]><![endif]-->
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<title>Table of Content </title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="title" content="Table of Content ">
|
||||
<meta name="generator" content="docfx 2.24.0.0">
|
||||
|
||||
<link rel="shortcut icon" href="favicon.ico">
|
||||
<link rel="stylesheet" href="styles/docfx.vendor.css">
|
||||
<link rel="stylesheet" href="styles/docfx.css">
|
||||
<link rel="stylesheet" href="styles/main.css">
|
||||
<meta property="docfx:navrel" content="toc.html">
|
||||
<meta property="docfx:tocrel" content="toc.html">
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
<body data-spy="scroll" data-target="#affix">
|
||||
<div id="wrapper">
|
||||
<header>
|
||||
|
||||
<nav id="autocollapse" class="navbar navbar-inverse ng-scope" role="navigation">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
|
||||
<a class="navbar-brand" href="index.html">
|
||||
<img id="logo" class="svg" src="logo.svg" alt="">
|
||||
</a>
|
||||
</div>
|
||||
<div class="collapse navbar-collapse" id="navbar">
|
||||
<form class="navbar-form navbar-right" role="search" id="search">
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control" id="search-query" placeholder="Search" autocomplete="off">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="subnav navbar navbar-default">
|
||||
<div class="container hide-when-search" id="breadcrumb">
|
||||
<ul class="breadcrumb">
|
||||
<li></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<div role="main" class="container body-content hide-when-search">
|
||||
<div class="article row grid">
|
||||
<div class="col-md-10">
|
||||
<article class="content wrap" id="_content" data-uid="">
|
||||
|
||||
<div id="sidetoggle">
|
||||
<div>
|
||||
<div class="sidefilter">
|
||||
@ -72,48 +11,14 @@
|
||||
<div class="toc" id="toc">
|
||||
|
||||
<ul class="nav level1">
|
||||
<li>
|
||||
<a href="guide/index.html" name="" title="User guides">User guides</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="configuration/index.html" name="" title="Configuration and settings">Configuration and settings</a>
|
||||
</li>
|
||||
</ul> </div>
|
||||
<li>
|
||||
<a href="guide/index.html" name="" title="User guides">User guides</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="configuration/index.html" name="" title="Configuration and settings">Configuration and settings</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div></article>
|
||||
</div>
|
||||
|
||||
<div class="hidden-sm col-md-2" role="complementary">
|
||||
<div class="sideaffix">
|
||||
<div class="contribution">
|
||||
<ul class="nav">
|
||||
</ul>
|
||||
</div>
|
||||
<nav class="bs-docs-sidebar hidden-print hidden-xs hidden-sm affix" id="affix">
|
||||
<!-- <p><a class="back-to-top" href="#top">Back to top</a><p> -->
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer>
|
||||
<div class="grad-bottom"></div>
|
||||
<div class="footer">
|
||||
<div class="container">
|
||||
<span class="pull-right">
|
||||
<a href="#top">Back to top</a>
|
||||
</span>
|
||||
|
||||
<span>Copyright © 2015-2017 Microsoft<br>Generated by <strong>DocFX</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" src="styles/docfx.vendor.js"></script>
|
||||
<script type="text/javascript" src="styles/docfx.js"></script>
|
||||
<script type="text/javascript" src="styles/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
</div>
|
@ -1,3 +1,3 @@
|
||||
### YamlMime:XRefMap
|
||||
sorted: true
|
||||
references: []
|
||||
### YamlMime:XRefMap
|
||||
sorted: true
|
||||
references: []
|
||||
|
Loading…
Reference in New Issue
Block a user