postman を使用してトークンをリクエストできます。
{
"access_token": "N1FL606bmDkZyLplpkLAihaviMQhB042z-rhY262M_W5nSWIv8fDOQiYkEn6GCuDnrxpdOWBS7lpxlBazHYlwnP1RvpDFED1i_ml89QNspyGOWB6TcMkT1MmfUAZ617k9MNvl5UJh2jKzUwvDDeXMURG9tEtmE3UX2L2D-1VA9kqYOzOB1UYbpMAfdTi84jsbR0lhLkNkReQ5fqg4B3IFbbWNGWu5ONb1uuf00ixL-BIMqSvEaNn58_zCyAVFWVzcH2tayYTGT5p_AItKfYiWaYHKC0pDoZ_OBdlpB7Odc7ScwjwFM5vtpBZE81rpk8yjXnrTEk_j9n0eiloJnpWwA",
"token_type": "bearer",
"expires_in": 899,
"refresh_token": "60da311d10f043b892c703c7fb7ab061",
"as:client_id": "Erp",
"userName": "bbauer",
".issued": "Tue, 30 Jun 2015 17:56:10 GMT",
".expires": "Tue, 30 Jun 2015 18:11:10 GMT"
}
次のように、保護されていないリソースから情報を取得することもできます: http://localhost:60689/api/Accounts/User/bbauer
{
"url": "http://localhost:60689/api/accounts/user/31",
"id": 31,
"userName": "bbauer",
"fullName": "Brian Bauer",
"email": null,
"emailConfirmed": false,
"roles": [
"Administrator"
],
"claims": []
}
それから、ユーザーが「管理者」の役割にあることがわかります。保護されたリソースを取得しようとすると、常に「このリクエストの承認が拒否されました」というメッセージが返されます。
コントローラーのメソッドは次のとおりです。
[Authorize(Roles = "Administrator")]
[Route("user/{id:int}", Name = "GetUserById")]
public async Task<IHttpActionResult> GetUser(int id)
{
var user = await AppUserManager.FindByIdAsync(id);
if (user != null)
{
return Ok(TheModelFactory.Create(user));
}
return NotFound();
}
Here are my settings in postman:
http://localhost:60689/api/Accounts/User/31
Content-Type: application/json
Accept: application/json
Authorization: Bearer N1FL606bmDkZyLplpkLAihaviMQhB042z-rhY262M_W5nSWIv8fDOQiYkEn6GCuDnrxpdOWBS7lpxlBazHYlwnP1RvpDFED1i_ml89QNspyGOWB6TcMkT1MmfUAZ617k9MNvl5UJh2jKzUwvDDeXMURG9tEtmE3UX2L2D-1VA9kqYOzOB1UYbpMAfdTi84jsbR0lhLkNkReQ5fqg4B3IFbbWNGWu5ONb1uuf00ixL-BIMqSvEaNn58_zCyAVFWVzcH2tayYTGT5p_AItKfYiWaYHKC0pDoZ_OBdlpB7Odc7ScwjwFM5vtpBZE81rpk8yjXnrTEk_j9n0eiloJnpWwA
fiddler を使用して、承認ヘッダーが送信されていることを確認できます。もう 1 つの注意点は、access_token を渡して保護されていない /user/username リソースを取得するときに、コードを中断して、次の設定で ClaimsPrincipal を確認できることです。
AuthenticationType: Bearer
IsAuthenticated: true
Name: bbauer
ただし、 User.IsInRole("Administrator") をテストすると、常に false になります。なぜそれは間違っているのですか?AspNetUserRole テーブルにはエントリがあり、ユーザーをフェッチすると、「管理者」という役割が 1 つ表示されます。神の緑の地球上で、ここで何が欠けているのでしょうか?
それが役立つ場合、これが私の Startup クラスです。
public class Startup
{
public static OAuthAuthorizationServerOptions OAuthServerOptions { get; private set; }
public static OAuthBearerAuthenticationOptions OAuthBearerOptions { get; private set; }
public static string PublicClientId { get; private set; }
public void Configuration(IAppBuilder app)
{
var httpConfig = new HttpConfiguration();
ConfigureOAuth(app);
WebApiConfig.Register(httpConfig);
app.UseCors(CorsOptions.AllowAll);
app.UseWebApi(httpConfig);
}
public void ConfigureOAuth(IAppBuilder app)
{
// Configure the db context and user manager to use a single instance per request
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
PublicClientId = "self";
OAuthServerOptions = new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/Token"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(15),
Provider = new SimpleAuthorizationServerProvider(PublicClientId),
RefreshTokenProvider = new SimpleRefreshTokenProvider(),
};
app.UseOAuthAuthorizationServer(OAuthServerOptions);
OAuthBearerOptions = new OAuthBearerAuthenticationOptions();
app.UseOAuthBearerAuthentication(OAuthBearerOptions);
}
}