Print Page | Close Window

User ID from asp.net security

Printed From: IdeaBlade
Category: DevForce
Forum Name: DevForce 2009
Forum Discription: For .NET 3.5
URL: http://www.ideablade.com/forum/forum_posts.asp?TID=1604
Printed Date: 28-Mar-2024 at 9:11am


Topic: User ID from asp.net security
Posted By: manishaudio
Subject: User ID from asp.net security
Date Posted: 30-Dec-2009 at 7:43am
Is there a way to get the user id from the UserBase or any other way through DevForce. The name is not enough for my purposes.



Replies:
Posted By: WardBell
Date Posted: 04-Jan-2010 at 5:56pm
Have you looked at our tutorial on this subject?
 
It's the "ASPNET Profile" tutorial. You can get to it by walking from the Windows Start Menu "IdeaBlade DevForce v??? | Documentation | Learning Resources | Security | 300 Silverlight".
 
On Vista/Win7 it's deployed to disk at: C:\Users\Public\Documents\DevForce\Learning Resources\100_Security\Samples\300SLV\CodeCS\ASPNET Profile
 
The sample assumes some familiarity with ASP.NET Security. If you understand how that works, you'll know how to extend your memberships with additional properties (key/value pairs). You can add "user id" and anything else you want. How you get this information ino the membership database is up to you.
 
If you are not an ASP.NET Security adept ((and I am not adept myself :-) )), you may want to pick up a book on the ASP.NET Security.
 
Once you have such a profile, you can proceed as described in the tutorial. The essential step is this one:
 

Create a CustomUser class - such as the one located in the web project which is also linked from the Silverlight project - with properties corresponding to the profile properties. For DevForce to find and use the custom class, it must extend UserBase, be serializable, and be discoverable as a "known type" via the IKnownType interface or the DiscoverableTypeAttribute.

DevForce will automatically populate the custom properties from the profile during login.

Hope that gets you going in the right direction. Cheers.


Posted By: manishaudio
Date Posted: 04-Jan-2010 at 7:27pm
Hi Ward,

Yes, I have looked at the tutorial but it does not suffice for my purposes. In order to get the userid, you need to reference the Membership class which is in System.web, something which cannot be done Silverlight

I just thought that since userid is quite frequently used in asp.net security design to extend the model, Ideablade would have provided a convenience method. Perhaps in the next release?

The examples only take you so far.


Posted By: WardBell
Date Posted: 05-Jan-2010 at 1:41pm
I'm sorry. I don't mean to be obtuse, but int that tutorial the Silverlight app makes no reference in to System.web nor to the Membership class. It receives an instance of the CustomUser class with the Profile information in it. This instance is accessible through the EntityManager.Principal property on the client. The CustomerUser class abstracts away the dependency on System.web.
 
The server-side code (regular .NET)  does have the System.web reference. I believe that is necessary to support the Web.config where the profile properties are defined. That's how DevForce knows how to populate the CustomUser
 
Perhaps I'm not understanding your question properly.
 


Posted By: manishaudio
Date Posted: 05-Jan-2010 at 2:15pm

I am simply trying to obtain the userid from the asp_users table in asp.net security. On the server side I can use the following code:

MembershipUser currentUser;

currentUser = Membership.GetUser(Login2.UserName);

Guid cguid = (Guid)currentUser.ProviderUserKey;

Session.Add("userid", cguid);

this.userguid.Value = cguid.ToString();

What I was looking to do is obtain this from the UserBase.  I don't understand how extending userbase will achieve this functionality.  I probably have to extend the AspAuthenticatingLoginManager and UserBase as well.  
 
Meanwhile, I am passing the user guid to the silverlight app via an html hidden field.  Hopefully, I've clarified things. 


Posted By: kimj
Date Posted: 05-Jan-2010 at 3:36pm
The UserBase is very IPrincipal and IIdentity oriented, so it holds name and roles and not much else.  The UserBase class is DevForce's IPrincipal implementation for Silverlight, but you can extend it fairly easily to do what you need.  As you mention you will also need to subclass the AspAuthenticatingLoginManager.   Alternatively, and harder, you could write your own ILoginManager and IPrincipal implementations.  Here's a sample of what you can do to stick the UserID into the custom UserBase so that it's available on the Silverlight client, as well as any server-side DevForce code your write.
 
// In CustomUser.cs in a server project, and shared in an SL project:
[DataContract]
public class CustomUser : UserBase, IKnownType {
   public CustomUser(IIdentity identity, IEnumerable<string> roles) :
      base(identity, roles) { }
 
   [DataMember]
   public Guid UserID { get; set; }
}
 
// In CustomLoginManager.cs in a server project:
public class CustomLoginManager : AspAuthenticatingLoginManager {
   protected override IPrincipal CreateUserCore(string name, bool isAuthenticated, IEnumerable<string> roles) {
      var user = base.CreateUserCore(name, isAuthenticated, roles) as CustomUser;
      user.UserID = (Guid)Membership.GetUser(name).ProviderUserKey;
      return user;
   }
}
 
Before this week we actually hadn't had any requests for the UserID.  We will look at incorporating this so that you don't need to write custom code.


Posted By: manishaudio
Date Posted: 06-Jan-2010 at 7:42am
How do I configure IB to use CustomLoginManager.  I don't understand the documentation.  If you could send me the snippet of the config file, I'd appreciate it.


Posted By: kimj
Date Posted: 06-Jan-2010 at 8:56am
The name of the assembly in which the CustomLoginManager is defined must be specified in the top-level probe asssembly names, even if it might already be in the probes under an EdmKey.  So if the class is defined in assembly "ServerLib" then the config will look something like this: 
 
<ideablade.configuration version="5.00" ... >
    <probeAssemblyNames>
       <probeAssemblyName name="ServerLib" />
    </probeAssemblyNames>
    ...
</ideablade.configuration>



Print Page | Close Window