ASP.NET Web Pages Using The Razor Syntax 
Chapter 16 – Adding Security and Membership 
177 
pages so they can be accessed only by logged-in members. Typically, if anonymous users try to access a 
members-only page, you redirect them to the login page. 
In this procedure, you'll limit access to the About page (About.cshtml) so that only logged-in users can 
access it. 
1.
Open the About.cshtml file. This is a content page that uses the _SiteLayout.cshtml page as its 
layout page. (For more about layout pages, see Chapter 3 - Creating a Consistent Look.) 
2.
Replace all the code in the About.cshtml file with the following code. This code tests the 
IsAuthenticated
property of the 
WebSecurity
object, which returns 
true
if the user has logged 
in. Otherwise, the code calls 
Response.Redirect
to send the user to the Login.cshtml page in the 
Account folder. Here's the complete About.cshtml file:    
@if (!WebSecurity.IsAuthenticated) { 
Response.Redirect("~/Account/Login"); 
@{ 
Layout = "~/_SiteLayout.cshtml"; 
Page.Title = "About My Site"; 
<p> 
This web page was built using ASP.NET Web Pages. For more information, 
visit the ASP.NET home page at <a href="http://www.asp.net" 
target="_blank">http://www.asp.net</a> 
</p> 
Note   The URLs in the example (like ~/Account/Login) don't include the .cshtml file extension. 
ASP.NET does not require file extensions in URLs that point to .cshtml pages. For more information, 
see the section on routing in Chapter 18 - Customizing Site-Wide Behavior.  
3.
Run Default.cshtml in a browser. If you're logged into the site, click the Logout link. 
4.
Click the About link. You're redirected to the Login.cshtml page, because you aren't logged in. 
To secure access to multiple pages, you can either add the security check to each page or you 
can create a layout page similar to _SiteLayout.cshtml that includes the security check. You 
would then reference the layout page with the security-check from the other pages in your site, 
in the same way that Default.cshtml currently references _SiteLayout.cshtml. 
Creating Security for Groups of Users (Roles) 
If your site has a lot of members, it's not efficient to check permission for each user individually before 
you let them see a page. What you can do instead is to create groups, or roles, that individual members 
belong to. You can then check permissions based on role. In this section, you'll create an "admin" role 
and then create a page that's accessible to users who are in (who belong to) that role. 
To begin, you need to add role information to the members database. 
How to add bookmarks to pdf files - add, remove, update PDF bookmarks in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Empower Your C# Project with Rapid PDF Internal Navigation Via Bookmark and Outline
create bookmarks in pdf from excel; adding bookmarks to pdf document
How to add bookmarks to pdf files - VB.NET PDF bookmark library: add, remove, update PDF bookmarks in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Empower Your VB.NET Project with Rapid PDF Internal Navigation Via Bookmark and Outline
create pdf bookmarks from word; export excel to pdf with bookmarks
ASP.NET Web Pages Using The Razor Syntax 
Chapter 16 – Adding Security and Membership 
178 
1.
In WebMatrix, click the Databases workspace selector. 
2.
In the left pane, open the StarterSite.sdf node, open the Tables node, and then double-click the 
webpages_Roles table. 
3.
Add a role named "admin". The RoleId field is filled in automatically. (It's the primary key and 
has been set to be an identify field, as explained in Chapter 5 – Working with Data.) 
4.
Take note of what the value is for the RoleId field. (If this is the first role you're defining, it will 
be 1.) 
5.
Close the webpages_Roles table. 
6.
Open the UserProfile table. 
7.
Make a note of the UserId value of one or more of the users in the table and then close the 
table. 
8.
Open the webpages_UserInRoles table and enter a UserID and a RoleID value into the table. For 
example, to put user 3 into the "admin" role, you'd enter these values: 
VB.NET PDF File Split Library: Split, seperate PDF into multiple
Add necessary references: how to split a PDF file into multiple ones by PDF bookmarks or outlines is an VB.NET example of splitting a PDF to two new PDF files.
adding bookmarks to pdf; create bookmarks pdf files
C# PDF File Split Library: Split, seperate PDF into multiple files
Add necessary references: how to split a PDF file into multiple ones by PDF bookmarks or outlines This is an C# example of splitting a PDF to two new PDF files.
how to add a bookmark in pdf; convert word pdf bookmarks
ASP.NET Web Pages Using The Razor Syntax 
Chapter 16 – Adding Security and Membership 
179 
9.
Close the webpages_UsersInRoles table. 
Now that you have roles defined, you can configure a page that's accessible to users who are in 
that role. 
10.
In the website root folder, create a new page named AdminError.cshtml and replace the existing 
content with the following code. This will be the page that users are redirected to if they aren't 
allowed access to a page.  
@{ 
Layout = "~/_SiteLayout.cshtml"; 
PageData["Title"] = "Admin-only Error"; 
<p>You must log in as an admin to access that page.</p> 
11.
In the website root folder, create a new page named AdminOnly.cshtml and replace the existing 
code with the following code: 
@{ 
Layout = "~/_SiteLayout.cshtml"; 
PageData["Title"] = "Administrators only"; 
@if ( Roles.IsUserInRole("admin")) { 
<span> Welcome <b>@WebSecurity.CurrentUserName</b>! </span> 
else { 
Response.Redirect("~/AdminError"); 
The 
Roles.IsUserInRole
method returns 
true
if the current user is a member of the "admin" 
role. 
12.
Run Default.cshtml in a browser, but don't log in. (If you're already logged in, log out.) 
13.
In the browser's address bar, change "Default" to "AdminOnly" in the URL. (In other words, 
request the AdminOnly.cshtml file.) You're redirected to the AdminError.cshtml page, because 
you aren't currently logged in as a user in the "admin" role. 
14.
Return to Default.cshtml and log in as the user you added to the "admin" role. 
15.
Browse to AdminOnly.cshtml page. This time you see the page. 
Creating a Password-Change Page 
You can let users change their passwords by creating a password-change page. This example shows the 
basics of a page that does this. (The Starter Site template includes a ChangePassword.cshtml file that 
contains more complete error checking than the page that you'll create in this procedure.) 
C# PDF File Compress Library: Compress reduce PDF size in C#.net
Bookmarks. Comments, forms and multimedia. Flatten visible layers. C#.NET DLLs: Compress PDF Document. Add necessary references: RasterEdge.Imaging.Basic.dll.
editing bookmarks in pdf; display bookmarks in pdf
C# PDF Convert to HTML SDK: Convert PDF to html files in C#.net
converter toolkit SDK, preserves all the original anchors, links, bookmarks and font to Use C#.NET Demo Code to Convert PDF Document to Add necessary references
create bookmarks pdf; edit pdf bookmarks
ASP.NET Web Pages Using The Razor Syntax 
Chapter 16 – Adding Security and Membership 
180 
1.
In the Account folder of the website, create a page named ChangePassword2.cshtml. 
2.
Replace the contents with the following code: 
@{ 
Layout = "~/_SiteLayout.cshtml"; 
PageData["Title"] = "Change Password"; 
var message = ""; 
if(IsPost) { 
string username = Request["username"]; 
string newPassword = Request["newPassword"]; 
string oldPassword = Request["oldPassword"]; 
if(WebSecurity.ChangePassword(username, oldPassword, newPassword)) { 
message="Password changed successfully!"; 
else 
message="Password could not be changed."; 
<style> 
.message  {font-weight:bold; color:red; margin:10px;} 
</style> 
<form method="post" action=""> 
Username: <input type="text" name="username" 
value="@WebSecurity.CurrentUserName" /> 
<br/> 
Old Password: <input type="password" name="oldPassword" value="" /> 
<br/> 
New Password: <input type="password" name="newPassword" value="" /> 
<br/><br/> 
<input type="submit" value="Change Password" /> 
<div class="message">@message</div> 
<div><a href="Default.cshtml">Return to home page</a></div> 
</form> 
.NET PDF SDK - Description of All PDF Processing Control Feastures
Full page navigation, zooming & rotation; Outlines, bookmarks, & thumbnail display; PDF Text Write & Extract. Insert and add text to any page of PDF document with
bookmark pdf documents; how to add bookmarks on pdf
C# Create PDF Library SDK to convert PDF from other file formats
PDF with a blank page, bookmarks, links, signatures, etc. metadata adding control, you can add some additional Create PDF Document from Existing Files Using C#.
pdf export bookmarks; add bookmarks to pdf file
ASP.NET Web Pages Using The Razor Syntax 
Chapter 16 – Adding Security and Membership 
181 
The body of the page contains text boxes that let users enter their user name and old and new 
passwords. In the code, you call the 
WebSecurity
helper's 
ChangePassword
method and pass it the 
values you get from the user. 
3.
Run the page in a browser. If you're already logged in, your user name is displayed in the page. 
4.
Try entering your old password incorrectly. When you don't enter a correct password, the 
WebSecurity.ChangePassword
method fails and a message is displayed. 
5.
Enter valid values and try changing your password again. 
Letting Users Generate a New Password 
If users forget their password, you can let them generate a new one. (This is different from changing a 
password that they know.) To let users get a new password, you use the 
WebSecurity
helper's 
GeneratePasswordResetToken
method to generate a token. A token is a cryptographically secure string 
that's sent to the user and that uniquely identifies the user for purposes like resetting a password. This 
procedure shows a typical way to do all this — generate the token, send it to the user in email, and then 
link to a page that reads the token and lets the user enter a new password. The link that the user will 
see in email will look something like this: 
http://localhost:36916/Account/PasswordReset2?PasswordResetToken=08HZGH0ALZ3CGz3 
The random-looking characters at the end of the URL are the token. 
(The Starter Site template includes a ForgotPassword.cshtml file that contains more complete error 
checking than the sample below.) 
XDoc.Word for .NET, Advanced .NET Word Processing Features
page navigation, zooming & rotation; Outlines, bookmarks, & thumbnail Convert Word to PDF; Convert Word to HTML5; Convert Add and insert a blank page or multiple
how to create bookmarks in pdf file; how to create bookmark in pdf with
XDoc.Excel for .NET, Comprehensive .NET Excel Imaging Features
page navigation, zooming & rotation; Outlines, bookmarks, & thumbnail Convert Excel to PDF; Convert Excel to HTML5; Convert Add a blank page or multiple pages to
bookmarks pdf reader; add bookmarks to pdf preview
ASP.NET Web Pages Using The Razor Syntax 
Chapter 16 – Adding Security and Membership 
182 
1.
In the Account folder of the website, add a new page named ForgotPassword2.cshtml. 
2.
Replace the existing content with the following code:  
@{ 
Layout = "~/_SiteLayout.cshtml"; 
PageData["Title"] = "Forgot your password?"; 
var message = ""; 
var username = ""; 
if (WebMail.SmtpServer.IsEmpty() ){ 
// The default SMTP configuration occurs in _start.cshtml 
message = "Please configure the SMTP server."; 
if(IsPost) { 
username = Request["username"]; 
var resetToken = WebSecurity.GeneratePasswordResetToken(username); 
var portPart = ":" + Request.Url.Port; 
var confirmationUrl = Request.Url.Scheme 
+ "://" 
+ Request.Url.Host 
+ portPart 
+ VirtualPathUtility.ToAbsolute("~/Account/PasswordReset2?PasswordResetToken=" 
+ Server.UrlEncode(resetToken)); 
WebMail.Send( 
to: username, 
subject: "Password Reset", 
body: @"Your reset token is:<br/><br/>" 
+ resetToken 
+ @"<br/><br/>Visit <a href=""" 
+ confirmationUrl 
+ @""">" 
+ confirmationUrl 
+ @"</a> to activate the new password." 
); 
message = "An email has been sent to " + username 
+ " with a password reset link."; 
<style> 
.message  {font-weight:bold; color:red; margin:10px;} 
</style> 
<form method="post" action=""> 
ASP.NET Web Pages Using The Razor Syntax 
Chapter 16 – Adding Security and Membership 
183 
@if(!message.IsEmpty()) { 
<div class="error">@message</div> 
} else{ 
<div> 
Enter your email address: <input type="text" name="username" /> <br/> 
<br/><br/> 
<input type="submit" value="Get New Password" /> 
</div> 
</form> 
The body of the page contains the text box that prompts the user for an email address. When 
the user submits the form, you first make sure that the SMTP mail settings have been made, 
since the point of the page is to send an email message. 
The heart of the page is in creating the password-reset token, which you do this way, passing 
the email address (user name) that the user provided: 
string resetToken = WebSecurity.GeneratePasswordResetToken(username);
The rest of the code is for sending the email message. Most of it is adapted from what's already 
in the Register.cshtml file that was created as part of your site from the template. 
You actually send the email by calling the 
WebMail
helper's 
Send
method. The body of the email is 
created by concatenating together variables with strings that include both text and HTML 
elements. When a user gets the email, the body of it looks something like this: 
3.
In the Account folder, create another new page named PasswordReset2.cshtml and replace the 
contents with the following code: 
@{ 
Layout  = "~/_SiteLayout.cshtml"; 
PageData["Title"] = "Password Reset"; 
var message = ""; 
var passwordResetToken = ""; 
if(IsPost) { 
var newPassword = Request["newPassword"]; 
var confirmPassword = Request["confirmPassword"]; 
passwordResetToken = Request["passwordResetToken"]; 
if( !newPassword.IsEmpty() && 
newPassword == confirmPassword && 
WebSecurity.ResetPassword(passwordResetToken, newPassword)) { 
ASP.NET Web Pages Using The Razor Syntax 
Chapter 16 – Adding Security and Membership 
184 
message = "Password changed!"; 
else { 
message = "Password could not be reset."; 
<style> 
.message  {font-weight:bold; color:red; margin:10px;} 
</style> 
<div class="message">@message</div> 
<form method="post" action=""> 
Enter your new password: <input type="password" name="newPassword" /> <br/> 
Confirm new password:    <input type="password" name="confirmPassword" /><br/> 
<br/> 
<input type="submit" value="Submit"/> 
</form> 
This page is what runs when the user clicks the link in the email to reset their password. The 
body contains text boxes to let the user enter a password and confirm it. 
You get the password token out of the URL by reading 
Request["PasswordResetToken"]
Remember that the URL will look something like this: 
http://localhost:36916/Account/PasswordReset2?PasswordResetToken=08HZGH0ALZ3CGz3 
Your code gets the token (here, 08HZGH0ALZ3CGz3) and then calls the 
WebSecurity
helper's 
ResetPassword
method, passing it the token and the new password. If the token is valid, the 
helper updates the password for the user who got the token in email. If the reset is successful, 
the 
ResetPassword
method returns 
true
In this example, the call to 
ResetPassword
is combined with some validation checks using the 
&&
(logical AND) operator. The logic is that the reset is successful if: 
The 
newPassword 
text box is not empty (the ! operator means not); and 
The values in 
newPassword
and 
confirmPassword
match; and 
The 
ResetPassword
method was successful. 
4.
Run ForgotPassword2.cshtml in a browser. 
5.
Enter your email address and then click Get New Password. The page sends an email. (There 
might be a short delay while it does this.) 
ASP.NET Web Pages Using The Razor Syntax 
Chapter 16 – Adding Security and Membership 
185 
6.
Check your email and look for a message whose subject line is "Password Reset." 
7.
In the email, click the link. You're taken to the PasswordReset2.cshtml page. 
8.
Enter a new password and then click Submit. 
Preventing Automated Programs from Joining Your Website 
The login page will not stop automated programs (sometimes referred to as web robots or bots) from 
registering with your website. (A common motivation for bots joining groups is to post URLs of products 
for sale.) You can help make sure the user is real person and not a computer program by using a 
CAPTCHA test to validate the input. (CAPTCHA stands for Completely Automated Public Turing test to 
tell Computers and Humans Apart.) 
In ASP.NET pages, you can use the 
ReCaptcha
helper to render a CAPTCHA test that is based on the 
reCAPTCHA service (http://recaptcha.net). The 
ReCaptcha
helper displays an image of two distorted 
words that users have to enter correctly before the page is validated. The user response is validated by 
the ReCaptcha.Net service. 
1.
Register your website at ReCaptcha.Net (http://recaptcha.net). When you've completed 
registration, you'll get a public key and a private key. 
2.
Add the ASP.NET Web Helpers Library to your website as described in Chapter 1 - Getting 
Started with ASP.NET Web Pages, if you haven't already. 
ASP.NET Web Pages Using The Razor Syntax 
Chapter 16 – Adding Security and Membership 
186 
3.
In the Account folder, open the file named Register.cshtml. 
4.
Remove the 
//
comment characters for the 
captchaMessage
variable. 
5.
Replace the 
PRIVATE_KEY
string with your private key. 
6.
Remove the 
//
comment characters from the line that contains the 
ReCaptcha.Validate
call. 
The following example shows the completed code. (Substitute your key for 
user-key-here
.) 
// Validate the user's response 
if (!ReCaptcha.Validate("user-key-here")) { 
captchaMessage = "Response was not correct"; 
isValid = false; 
6.
At the bottom of the Register.cshtml page, replace the 
PUBLIC_KEY
string with your public key. 
7.
Remove the comment characters from the line that contains the 
ReCaptcha
call. The following 
example shows the completed code (except that you again substitute your key for 
user-key-
here
): 
@ReCaptcha.GetHtml("user-key-here", theme: "white")
8.
Run Default.cshtml in a browser. If you're logged into the site, click the Logout link. 
9.
Click the Register link and test the registration using the CAPTCHA test. 
Note   If your computer is on a domain that uses proxy server, you might need to configure the 
defaultproxy
element of the Web.config file. The following example shows a Web.config file with 
the 
defaultproxy
element configured to enable the reCAPTCHA service to work.  
<?xml version="1.0" encoding="utf-8"?> 
Documents you may be interested
Documents you may be interested