2017-02-24 10 views
3

ServiceStackの認証/承認コードのいくつかの例を見てきましたが、この問題を乗り越えることはできません。ServiceStack APIサービスRequiresAnyRoleは常に403エラーを返します

私はBasicAuthProviderから派生し、それを私のAppHostのプラグインに登録したカスタムAuthFeatureを作成しました。私のカスタムプロバイダーではTryAuthenticateOnAuthenticatedをオーバーロードし、私のサービスでは[Authenticate][RequiresAnyRole("Test")]の属性を持つクラスを装飾しました。私のユースケースでは、TryAuthenticateを呼び出して認証を渡すAuthヘッダにユーザ名とパスワードを渡してから、OnAuthenticatedメソッドにアクセスしてセッション変数にロール(この場合は "Test")を入力します。結果は403 Invalid Roleです。 RequiresAnyRole属性を削除すると認証が機能し、現在のセッション変数を見て自分が作成した役割を見ることもできます。さらに、同じ結果を持つRequiredRoleRequiredPermission(セッションへのアクセス許可を追加して)を試しました。

テストロールを正しくセッションに追加しているかどうか、またはカスタム認証プロバイダを正しく実装していることを教えてもらえますか?あなたは​​むしろ持続していないセッションオブジェクトを使用するよりもAssignRoleにを使用使用する必要があります

[Authenticate] 
[RequiresAnyRole("Test")] 
public class TestService: Service 
{ 
    ... 

答えて

2

マイ認証プロバイダーコード:

public class AdAuthProvider : BasicAuthProvider 
{ 
    public override bool TryAuthenticate(IServiceBase authService, string userName, string password) 
    { 
     var authenticated = false; 
     UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(new PrincipalContext(ContextType.Domain), userName); 
     var adRealm = System.Configuration.ConfigurationManager.AppSettings["ADRealm"]; 
     if (userPrincipal != null) 
     { 
      using (var pc = new PrincipalContext(ContextType.Domain, adRealm)) 
      { 
       authenticated = pc.ValidateCredentials(userName, password); 
      }     
     } 
     return authenticated; 
    } 


    public override IHttpResult OnAuthenticated(IServiceBase authService, IAuthSession session, IAuthTokens tokens, Dictionary<string, string> authInfo) 
    { 

     session.Roles = new List<string>();     
     session.Roles.Add("Test");   

     authService.SaveSession(session, new System.TimeSpan(0, 30, 0)); 
     return null; 

    } 

マイサービスコード。

authRepoの解決方法を確認し、役割を割り当てる方法については、GitHubのassignroleサービスコードをご覧ください。

var authRepo = HostContext.AppHost.GetAuthRepository(base.Request); 
using (authRepo as IDisposable) 
{ 
    var userAuth = authRepo.GetUserAuthByUserName(request.UserName); 
    if (userAuth == null) 
     throw HttpError.NotFound(request.UserName); 

    authRepo.AssignRoles(userAuth, request.Roles, request.Permissions); 

https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack/Auth/AssignRolesService.cs

関連する問題