2009-08-13 4 views
0

사용자 지정 MembershipProvider를 사용하는 인증 서비스 인 ASP.NET 서비스와 함께 사용하도록 구성된 Windows Forms 응용 프로그램이 있습니다.사용자 지정 MembershipProvider와 함께 클라이언트 응용 프로그램 서비스를 사용할 수 없습니다.

Windows 응용 프로그램에서 Membership.CreateUser를 호출하면 NotSupportedException이 throw됩니다. "지정된 메서드가 지원되지 않습니다."

웹 사이트에서 웹 페이지를 생성하고 MembershipProvider를 테스트 해 보았습니다. 웹 사이트 내에서 wooeking 할 때 모든 것이 잘 작동합니다.

사용자 정의 (SqlMembershipProvider 아님) MembershipProvider를 사용하는 방법에 대한 아이디어 나 링크는 정말 감사하겠습니다!

편집 : ValidateUser 메소드가 작동합니다. 오버라이드 (override) createuser가이 작동하지 않습니다 내가 재정의를 시도 하위 createuser가 (.......) MembershipUser 반환 새 사용자() 최종 하위 하지만 난 여전히 이전과 같은 excetption를 얻을.

+0

@Shimmy, heads-up, 아직 구현이 없다면 내 대답에서 약간의 마일리지가 발생할 수 있습니다. –

답변

2

클라이언트 응용 프로그램 서비스는 CreateUser 메서드를 지원하지 않습니다. 여기

는 ClientFormsAuthenticationMembershipProvider에서 createuser가 방법 소스 코드입니다

public override MembershipUser CreateUser 
(
    string username, 
    string password, 
    string email, 
    string passwordQuestion, 
    string passwordAnswer, 
    bool isApproved, 
    object providerUserKey, 
    out MembershipCreateStatus status 
) 
{ 
    throw new NotSupportedException(); 
} 
-1

This page은 맞춤 멤버 자격 공급자를 구현하는 방법을 보여줍니다. 나는 그것이 당신의 문제에 도움이 될지 모르겠다.

0

가 나는 ASP.NET AJAX 서비스 (클라이언트 응용 프로그램 서비스)를 구현할 때 사용자 지정 멤버 자격 공급자라고 생각합니다. 간단한 Windows 응용 프로그램의 경우 My.User.CurrentPrinciple을 사용하여 인증 할 수 있습니다.

0

사용자 정의 공급자를 통해 json 프록시를 작성하려고 할 것입니다. 잘 기억해야 할 점은 프록시 엔드 포인트를 보호한다는 것입니다! PROXY ENDPOINT를 확보하십시오!

이 클래스의 모든 메소드를 테스트하지는 않았지만 이전 구현은 정상적으로 수행되었으므로 결과가 나오는 곳으로 이동할 수 있습니다.

안전한 엔드 포인트!

// <copyright project="Salient.ScriptModel" file="MembershipService.svc" company="Sky Sanders"> 
// This source is a Public Domain Dedication. 
// http://skysanders.net/subtext 
// Attribution is appreciated 
// </copyright> 
// <version>1.0</version> 
using System; 
using System.Collections.Generic; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.ServiceModel.Activation; 
using System.Web.Security; 

namespace Salient.ScriptModel 
{ 
    [ServiceContract(Namespace = "Salient.ScriptModel", Name = "MembershipProvider")] 
    public interface IMembershipProvider 
    { 
     string ProviderName { get; set; } 

     [OperationContract] 
     DateTime TestInput(DateTime date); 

     [OperationContract] 
     ProviderProperties GetProviderProperties(); 

     [OperationContract] 
     MembershipUser GetUserByKey(object providerUserKey, bool userIsOnline); 

     [OperationContract] 
     MembershipCreateResult CreateUser(string username, string password, 
              string email, string passwordQuestion, 
              string passwordAnswer, bool isApproved, 
              object providerUserKey); 

     [OperationContract] 
     MembershipCreateResult AddUser(MembershipUser user); 

     [OperationContract] 
     bool ChangePasswordQuestionAndAnswer(string username, string password, 
              string newPasswordQuestion, string newPasswordAnswer); 

     [OperationContract] 
     string GetPassword(string username, string answer); 

     [OperationContract] 
     bool ChangePassword(string username, string oldPassword, string newPassword); 

     [OperationContract] 
     string ResetPassword(string username, string answer); 

     [OperationContract] 
     void UpdateUser(MembershipUser user); 

     [OperationContract] 
     bool ValidateUser(string username, string password); 

     [OperationContract] 
     bool UnlockUser(string userName); 

     [OperationContract] 
     MembershipUser GetUserByName(string username, bool userIsOnline); 

     [OperationContract] 
     string GetUserNameByEmail(string email); 

     [OperationContract] 
     bool DeleteUser(string username, bool deleteAllRelatedData); 

     [OperationContract] 
     MembershipFindResult GetAllUsers(int pageIndex, int pageSize); 

     [OperationContract] 
     int GetNumberOfUsersOnline(); 

     [OperationContract] 
     MembershipFindResult FindUsersByName(string usernameToMatch, int pageIndex, 
              int pageSize); 

     [OperationContract] 
     MembershipFindResult FindUsersByEmail(string emailToMatch, int pageIndex, 
               int pageSize); 
    } 

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    public class MembershipProvider : IMembershipProvider 
    { 
     private System.Web.Security.MembershipProvider Provider 
     { 
      get 
      { 
       if (string.IsNullOrEmpty(ProviderName)) 
       { 
        return Membership.Provider; 
       } 
       return Membership.Providers[ProviderName]; 
      } 
     } 

     #region IMembershipProvider Members 

     public DateTime TestInput(DateTime date) 
     { 
      return date; 
     } 

     public string ProviderName { get; set; } 

     public ProviderProperties GetProviderProperties() 
     { 
      var returnValue = new ProviderProperties 
            { 
             ApplicationName = Provider.ApplicationName, 
             EnablePasswordReset = Provider.EnablePasswordReset, 
             EnablePasswordRetrieval = Provider.EnablePasswordRetrieval, 
             MaxInvalidPasswordAttempts = Provider.MaxInvalidPasswordAttempts, 
             MinRequiredNonAlphanumericCharacters = 
              Provider.MinRequiredNonAlphanumericCharacters, 
             MinRequiredPasswordLength = Provider.MinRequiredPasswordLength, 
             PasswordAttemptWindow = Provider.PasswordAttemptWindow, 
             PasswordFormat = Provider.PasswordFormat, 
             PasswordStrengthRegularExpression = Provider.PasswordStrengthRegularExpression, 
             RequiresQuestionAndAnswer = Provider.RequiresQuestionAndAnswer, 
             RequiresUniqueEmail = Provider.RequiresUniqueEmail 
            }; 
      return returnValue; 
     } 

     public MembershipUser GetUserByKey(object providerUserKey, bool userIsOnline) 
     { 
      return Provider.GetUser(providerUserKey, userIsOnline); 
     } 

     public MembershipCreateResult CreateUser(string username, string password, 
               string email, string passwordQuestion, 
               string passwordAnswer, bool isApproved, 
               object providerUserKey) 
     { 
      MembershipCreateStatus status; 
      MembershipUser user = Provider.CreateUser(username, password, email, passwordQuestion, passwordAnswer, 
                 isApproved, 
                 providerUserKey, out status); 
      return new MembershipCreateResult(user, status); 
     } 

     public MembershipCreateResult AddUser(MembershipUser user) 
     { 
      return new MembershipCreateResult(user, MembershipCreateStatus.DuplicateEmail); 
     } 

     public bool ChangePasswordQuestionAndAnswer(string username, string password, 
                string newPasswordQuestion, string newPasswordAnswer) 
     { 
      return Provider.ChangePasswordQuestionAndAnswer(username, password, newPasswordQuestion, newPasswordAnswer); 
     } 

     public string GetPassword(string username, string answer) 
     { 
      return Provider.GetPassword(username, answer); 
     } 

     public bool ChangePassword(string username, string oldPassword, string newPassword) 
     { 
      return Provider.ChangePassword(username, oldPassword, newPassword); 
     } 

     public string ResetPassword(string username, string answer) 
     { 
      return Provider.ResetPassword(username, answer); 
     } 

     public void UpdateUser(MembershipUser user) 
     { 
      Provider.UpdateUser(user); 
     } 

     public bool ValidateUser(string username, string password) 
     { 
      return Provider.ValidateUser(username, password); 
     } 

     public bool UnlockUser(string userName) 
     { 
      return Provider.UnlockUser(userName); 
     } 

     public MembershipUser GetUserByName(string username, bool userIsOnline) 
     { 
      return Provider.GetUser(username, userIsOnline); 
     } 

     public string GetUserNameByEmail(string email) 
     { 
      return Provider.GetUserNameByEmail(email); 
     } 

     public bool DeleteUser(string username, bool deleteAllRelatedData) 
     { 
      return Provider.DeleteUser(username, deleteAllRelatedData); 
     } 

     public MembershipFindResult GetAllUsers(int pageIndex, int pageSize) 
     { 
      int totalRecords; 
      MembershipUserCollection users = Provider.GetAllUsers(pageIndex, pageSize, out totalRecords); 
      var list = new List<MembershipUser>(); 
      foreach (MembershipUser user in users) 
      { 
       list.Add(user); 
      } 
      return new MembershipFindResult(list, totalRecords); 
     } 

     public int GetNumberOfUsersOnline() 
     { 
      return Provider.GetNumberOfUsersOnline(); 
     } 

     public MembershipFindResult FindUsersByName(string usernameToMatch, int pageIndex, 
                int pageSize) 
     { 
      int totalRecords; 
      MembershipUserCollection users = Provider.FindUsersByName(usernameToMatch, pageIndex, pageSize, 
                     out totalRecords); 
      var list = new List<MembershipUser>(); 
      foreach (MembershipUser user in users) 
      { 
       list.Add(user); 
      } 
      return new MembershipFindResult(list, totalRecords); 
     } 

     public MembershipFindResult FindUsersByEmail(string emailToMatch, int pageIndex, 
                int pageSize) 
     { 
      int totalRecords; 
      MembershipUserCollection users = Provider.FindUsersByEmail(emailToMatch, pageIndex, pageSize, 
                     out totalRecords); 
      var list = new List<MembershipUser>(); 
      foreach (MembershipUser user in users) 
      { 
       list.Add(user); 
      } 
      return new MembershipFindResult(list, totalRecords); 
     } 

     #endregion 
    } 

    [DataContract] 
    public class MembershipFindResult 
    { 
     [DataMember] public int RecordCount; 
     [DataMember] public IEnumerable<MembershipUser> Users; 

     public MembershipFindResult() 
     { 
     } 

     public MembershipFindResult(IEnumerable<MembershipUser> users, int recordCount) 
     { 
      Users = users; 
      RecordCount = recordCount; 
     } 
    } 

    [DataContract] 
    public class MembershipCreateResult 
    { 
     [DataMember] public MembershipCreateStatus CreateStatus; 
     [DataMember] public MembershipUser User; 

     public MembershipCreateResult() 
     { 
     } 

     public MembershipCreateResult(MembershipUser user, MembershipCreateStatus createStatus) 
     { 
      User = user; 
      CreateStatus = createStatus; 
     } 
    } 

    [DataContract] 
    public class ProviderProperties 
    { 
     public ProviderProperties() 
     { 
     } 

     public ProviderProperties(bool enablePasswordRetrieval, bool enablePasswordReset, bool requiresQuestionAndAnswer, 
            int maxInvalidPasswordAttempts, 
            int passwordAttemptWindow, bool requiresUniqueEmail, 
            MembershipPasswordFormat passwordFormat, int minRequiredPasswordLength, 
            int minRequiredNonAlphanumericCharacters, 
            string passwordStrengthRegularExpression, string applicationName) 
     { 
      EnablePasswordRetrieval = enablePasswordRetrieval; 
      EnablePasswordReset = enablePasswordReset; 
      RequiresQuestionAndAnswer = requiresQuestionAndAnswer; 
      MaxInvalidPasswordAttempts = maxInvalidPasswordAttempts; 
      PasswordAttemptWindow = passwordAttemptWindow; 
      RequiresUniqueEmail = requiresUniqueEmail; 
      PasswordFormat = passwordFormat; 
      MinRequiredPasswordLength = minRequiredPasswordLength; 
      MinRequiredNonAlphanumericCharacters = minRequiredNonAlphanumericCharacters; 
      PasswordStrengthRegularExpression = passwordStrengthRegularExpression; 
      ApplicationName = applicationName; 
     } 

     [DataMember] 
     public bool EnablePasswordRetrieval { get; set; } 

     [DataMember] 
     public bool EnablePasswordReset { get; set; } 

     [DataMember] 
     public bool RequiresQuestionAndAnswer { get; set; } 

     [DataMember] 
     public int MaxInvalidPasswordAttempts { get; set; } 

     [DataMember] 
     public int PasswordAttemptWindow { get; set; } 

     [DataMember] 
     public bool RequiresUniqueEmail { get; set; } 

     [DataMember] 
     public MembershipPasswordFormat PasswordFormat { get; set; } 

     [DataMember] 
     public int MinRequiredPasswordLength { get; set; } 

     [DataMember] 
     public int MinRequiredNonAlphanumericCharacters { get; set; } 

     [DataMember] 
     public string PasswordStrengthRegularExpression { get; set; } 

     [DataMember] 
     public string ApplicationName { get; set; } 
    } 

} 

편집 : 맞는 댓글을 삭제해야했습니다. 내 블로그에서 전체 구현을 계속 주시하십시오.

p.s. 이 끝 부분을 확인하십시오!

+0

끝점을 보호해야합니까? – bzlm