web-dev-qa-db-ja.com

許可ロールWeb API oauth owin

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です。何かを有効にする必要がありますか?

22
CaTourist

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);
}
45
Xavier Egea