自定义成员资格提供程序验证成功但无法GetUser()

时间:2011-08-12 13:50:40

标签: c# .net wcf asp.net-membership

Hello Stackoverflow用户,

我目前正在深入研究WCF,我目前正在设置一个使用clientCredentialType =“UserName”的POC网络服务。由于我们有一些独特的愿望,我们选择了自定义成员提供者。我目前正逐一实施。这意味着大多数方法(尚未使用)都会抛出未实现的异常。

实现的方法是Initialize()和ValidateUser()方法,验证用户工作,当给出正确的凭证时,一个人验证,当我进入伪造时,他们会得到安全例外。

到目前为止一切顺利。

我怎么调用GetUser()方法(从某个地方获取用户名然后调用):

public override MembershipUser GetUser(string username, bool userIsOnline)
{
    throw new NotImplementedException();
}

正如你所看到的,这不是已实现的(很明显,它不起作用),让我感到沮丧的是,我无法让它工作,因为从底层GetUser()传递的用户名方法(来自基类MembershipProvider)传递一个空字符串。

我有什么特别的遗忘吗?有没有其他人获得解决此问题的自定义成员提供者的经验?

编辑:添加了callstack

  

at System.Web.Security.Membership.GetUser(String username,Boolean   userIsOnline)在System.Web.Security.Membership.GetUser()处   D:\ Projects \ IBS中的DirectPay.WCF.Services.Service.TestConnection()   projects \ DirectPay \ source \ WCF.Services \ Service.svc.cs:第21行at   SyncInvokeTestConnection(Object,Object [],Object [])at   System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(对象   实例,对象[]输入,对象[]&输出)   System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&安培;   RPC)

2 个答案:

答案 0 :(得分:0)

用户通常应该存储在您自己的自定义数据库中,这是实现自定义成员资格提供程序的重点。这是我对同一功能的实现:

/// <summary>
/// Gets information from the data source for a user.
/// Provides an option to update the last-activity date/time stamp for the user.
/// </summary>
/// <param name="username">The name of the user to get information for.</param>
/// <param name="userIsOnline">true to update the last-activity date/time 
/// stamp for the user; false to return user information without updating 
/// the last-activity date/time stamp for the user.</param>
/// <returns>A MembershipUser object populated with the specified
/// user's information from the data source.</returns>
public override MembershipUser GetUser(string username, bool userIsOnline)
{
    // Get User from my custom database
    User user = Database.User.GetUser(username);

    // Convert User to MebmershipUser (or return null if User == null)
    return user == null ? null : new MembershipUser(
        "CustomMembershipProvider",
        user.UserName, 
        user.UserID,
        user.Email,
        string.Empty, 
        user.Comments, 
        user.Active,
        false, 
        user.CreatedDate, 
        user.LastLoginDate, 
        DateTime.Now, 
        user.LastPasswordChangedDate, 
        DateTime.Now);
}

答案 1 :(得分:0)

好吧,我的目前的答案是在我的头撞墙几个小时之后(很可能是因为我不知道关于WCF的杰克,但是^^)发现你可以得到当前用户:

ServiceSecurityContext.Current.PrimaryIdentity.Name;

遗憾的是,GetUser()方法仍然不是我想要的,解决方法是在我的自定义membershipprovider中覆盖此方法并在那里获取名称。另一种选择是将以下内容添加到GetUser(字符串用户名,bool userIsOnline)方法中:

if(string.IsNullOrWhiteSpace(username))
{
   username = ServiceSecurityContext.Current.PrimaryIdentity.Name;
}

我希望找到一种方法,而无需手动获取用户名,因此我不会将此标记为您的答案,如果有的话,这是一种解决方法。