OWINミドルウェアを使用してASP.NET Web APIにトークン認証システムを実装しました。 RESTクライアントで認証に成功し、APIを呼び出すための認証トークンを取得できます。コントローラーでGETアクションに_[Authorize]
_属性を設定すると、正しく動作します。有効なトークンがないため、401メッセージでリソースを拒否しますが、roles
パラメーターで[Authorize(Roles="admins")]
を使用すると、ユーザーの役割が認識されません。データベースでusersinroles
が正しく入力されていることを確認しました。
これはコードスニペットです。
_[Authorize(Roles = "admins")]
public IEnumerable<CompanyModel> Get()
{
ClaimsPrincipal principal = Request.GetRequestContext().Principal as ClaimsPrincipal;
bool isrole = principal.IsInRole("admins");
_
また、roles
パラメーターなしでアクションをチェックしました。isrole
ブール値は常にfalse
です。何かを有効にする必要がありますか?
GrantResourceOwnerCredentialsメソッドに追加する必要があります。
identity.AddClaim(new Claim(ClaimTypes.Role, "admins"));
ステップバイステップ
StartUp.csクラスには、次のようなカスタムプロバイダーが必要です。
Provider = new CustomAuthorizationServerProvider()
例えば:
public void ConfigureOAuth(IAppBuilder app)
{
OAuthAuthorizationServerOptions oAuthServerOptions = new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
Provider = new CustomAuthorizationServerProvider()
};
// Token Generation
app.UseOAuthAuthorizationServer(oAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
次に、OAuthAuthorizationServerProviderクラスから継承するCustomAuthorizationServerProviderがGrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)をオーバーライドします。
次に、ユーザーが正しいユーザー名とパスワードを持っていることを確認した後、追加する必要があります
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
...
// other claims
...
identity.AddClaim(new Claim(ClaimTypes.Role, "admins"));
...
var ticket = new AuthenticationTicket(identity, properties);
context.Validated(ticket);
編集済み
「admins」harcoded stringを使用する代わりに、DBからユーザーロールを取得できます。
var roles = await userManager.GetRolesAsync(userId);
そのため、リポジトリに次のメソッドを追加できます。
public async Task<IList<string>> UserRoles(string userId)
{
IList<string> roles = await userManager.GetRolesAsync(userId);
return roles;
}
そして、オーバーライドされたGrantResourceOwnerCredentials追加から呼び出します:
using (AuthRepository repository = new AuthRepository())
{
IdentityUser user = await repository.FindUser(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect");
return;
}
var roles = repository.UserRoles(user.Id);
}