SharePoint 2010 Form Authentication (SQL) based on existing database

博客地址 http://blog.csdn.net/foxdave

SharePoint 2010 表单认证,基于现有数据库的用户信息表

本文主要描述本人配置过程中涉及到的步骤,仅作为参考,不要仅限于此步骤。

另外本文通俗易懂,适合大众口味儿。

 

I. 开启并配置基于声明的身份验证

打开SharePoint 2010 Management Shell,依次执行以下语句

$app = Get-SPWebApplication "<your webapp url>"
$app.UseClaimsAuthentication = "true"
$app.Update()

进入管理中心->应用程序管理->管理Web应用程序,选中上面的webapp,点击身份验证提供程序,点击默认链接弹出验证配置窗口。

勾选“启用基于窗体的身份验证(FBA)”,填入名称,这里用mp和rp举例,之后会用到;登录页URL这里,可以默认也可以自定义,这里我选择了自定义,是自己写的一个登录页。

点击保存完成第一步骤。

 

II. WebConfig配置

需要配置mp和rp的位置有三个,分别是管理中心、webapp端口对应的IIS目录,以及{SharePoint Root}\WebServices\SecurityToken目录下的web.config文件

需要添加的内容如下

<membership defaultProvider="i"><providers><!--将以下节点添加到指定位置--><add name="mp" type="<assembly>" />
      </providers></membership>
<roleManager defaultProvider="c" enabled="true" cacheRolesInCookie="false"><providers><!--将以下节点添加到指定位置--><add name="rp" type="<assembly>" /></providers></roleManager>
<connectionStrings><add connectionString="<connStr>" name="Conn" />
  </connectionStrings>

其中assembly为自定义Provider的dll的描述,后面会提到;connStr为数据库连接串。

 

III. 自定义MembershipProvider

大致的思路是写两个sealed类,mp继承MembershipProvider,rp继承RoleProvider,我的环境中没有用到角色,所以rp只做了继承,注释掉了

rp代码

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Web.Security;namespace Providers
{public sealed class rp : RoleProvider{private bool mWriteExceptionsToEventLog = false;public bool WriteExceptionsToEventLog{get{return mWriteExceptionsToEventLog;}set{mWriteExceptionsToEventLog = value;}}public override void Initialize(string name, NameValueCollection config){base.Initialize(name, config);}private string pApplicationName = "";public override string ApplicationName{get{return pApplicationName;}set{pApplicationName = value;}}public override void AddUsersToRoles(string[] usernames, string[] rolenames){throw new NotImplementedException();}public override void CreateRole(string rolename){throw new NotImplementedException();}public override bool DeleteRole(string rolename, bool throwOnPopulatedRole){throw new NotImplementedException();}public override string[] GetAllRoles(){return null;}public override string[] GetRolesForUser(string username){return null;}public override string[] GetUsersInRole(string rolename){return null;}public override bool IsUserInRole(string username, string rolename){return false;}public override void RemoveUsersFromRoles(string[] usernames, string[] rolenames){throw new NotImplementedException();}public override bool RoleExists(string rolename){return false;}public override string[] FindUsersInRole(string rolename, string usernameToMatch){return null;}private static List<string> GetAllUsers(){return null;}private static List<string> FindAllRoles(){return null;}private List<string> FindRolesForUser(string username){return null;}}
}

mp最少实现以下四个方法,完成在SharePoint上查找添加用户以及登录逻辑的自定义处理。

GetAllUsers、GetUser、ValidateUser、FindUsersByName

我这里大致的做法就是用Webconfig中添加的数据库连接串去操作现有数据库的用户表,尝试用Entities但是好像行不通

mp核心代码

public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords){MembershipUserCollection spusers = new MembershipUserCollection();List<MIPUser> users = GetAllUsers();foreach (MIPUser user in spusers){MembershipUser spuser = new MembershipUser(this.Name,user.LoginName,user.LoginName,user.LoginName + "@contoso.com","","",true,false,DateTime.Today,DateTime.Today,DateTime.Today,DateTime.Today,DateTime.Today);spusers.Add(spuser);}totalRecords = spusers.Count;return spusers;}
public override MembershipUser GetUser(object providerUserKey, bool userIsOnline){MembershipUser spuser = null;List<MIPUser> users = GetAllUsers();var query = users.Where(u => u.LoginName.IndexOf(providerUserKey.ToString(), StringComparison.CurrentCultureIgnoreCase) >= 0 ||u.DisplayName.IndexOf(providerUserKey.ToString(), StringComparison.CurrentCultureIgnoreCase) >= 0).Select(u => u);if (query.Count() != 0){var user = query.First();spuser = new MembershipUser(this.Name,user.LoginName,user.LoginName,user.LoginName + "@contoso.com","","",true,false,DateTime.Today,DateTime.Today,DateTime.Today,DateTime.Today,DateTime.Today);return spuser;}else{return null;}}
public override MembershipUser GetUser(string username, bool userIsOnline){MembershipUser spuser = null;List<MIPUser> users = GetAllUsers();var query = users.Where(u => u.LoginName.Equals(username, StringComparison.CurrentCultureIgnoreCase) ||u.DisplayName.Equals(username, StringComparison.CurrentCultureIgnoreCase)).Select(u => u);if (query.Count() != 0){var user = query.First();spuser = new MembershipUser(this.Name,user.LoginName,user.LoginName,user.LoginName + "@contoso.com","","",true,false,DateTime.Today,DateTime.Today,DateTime.Today,DateTime.Today,DateTime.Today);return spuser;}else{return null;}}
public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords){MembershipUserCollection spusers = new MembershipUserCollection();List<MIPUser> users = GetAllUsers();var query = users.Where(u => u.LoginName.IndexOf(usernameToMatch, StringComparison.CurrentCultureIgnoreCase) >= 0 ||u.DisplayName.IndexOf(usernameToMatch, StringComparison.CurrentCultureIgnoreCase) >= 0).Select(name => name);foreach (var user in query){MembershipUser spuser = new MembershipUser(this.Name,user.LoginName,user.LoginName,user.LoginName + "@contoso.com","","",true,false,DateTime.Today,DateTime.Today,DateTime.Today,DateTime.Today,DateTime.Today);spusers.Add(spuser);}totalRecords = query.Count();return spusers;}
写好后将dll添加强命名,部署到GAC。

 

IV. 番外-自定义登录页

自定义登录页,没什么难度,直接贴代码了

ASPX

<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %><%@ Page Language="C#" AutoEventWireup="true" CodeBehind="login.aspx.cs" Inherits="Authentication.login" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title></title><script language="javascript" for="document" event="onkeydown">if (event.keyCode == 13) {document.getElementById("<%=btnLogin.ClientID %>").click();}</script><script language="javascript" type="text/javascript">function login() {if (document.getElementById("<%=txtUserName.ClientID %>").value == "") {alert('请输入用户名');return;}if (document.getElementById("<%=txtPassword.ClientID %>").value == "") {alert('请输入密码');return;}document.getElementById("<%=btnLogin.ClientID %>").click();}</script>
</head>
<body><form action="" id="form" runat="server"><table border="0" cellspacing="0" cellpadding="0" class="login_table"><tr><td class="login_td" align="center"><div class="logan_contai"><div class="login_box" style="height: 488px;"><div class="login_top"><div class="login_top_wel">欢迎使用</div><div class="login_top_nav"></div></div><div class="login_main png"><asp:Literal ID="ltError" runat="server"></asp:Literal><div class="login_txt_box"><ul><li><div class="login_name">用户名</div><div class="login_inpbox"><asp:TextBox ID="txtUserName" runat="server" CssClass="login_input" οnfοcus="this.className='login_input_hov'"MaxLength="100" οnblur="this.className='login_input'"></asp:TextBox><div class="login_wrong"></div></div></li><li><div class="login_name">密 码</div><div class="login_inpbox"><asp:TextBox ID="txtPassword" runat="server" TextMode="Password" CssClass="login_input"οnfοcus="this.className='login_input_hov'" MaxLength="100" οnblur="this.className='login_input'"></asp:TextBox></div><div class="login_wrong"></div></li><li><div class="login_btn" style="width: 191px; padding: 9px 0 0 155px;"><a href="#" title="" οnclick="login()">登 录</a></div><div style="display: none;"><asp:Button CssClass="login_btn" Width="191px" ID="btnLogin" runat="server" Text="登录"OnClick="btnLogin_Click" Style="padding: 9px 0 0 155px" /></div></li></ul></div></div><div class="login_foot png"></div></div></div></td></tr></table></form>
</body>
</html>

CS

using System;
using System.Web.UI;
using Microsoft.SharePoint.IdentityModel;namespace Authentication
{public partial class login : Page{protected void Page_Load(object sender, EventArgs e) { }protected void btnLogin_Click(object sender, EventArgs e){Login(this.txtUserName.Text, this.txtPassword.Text);}private void Login(string username, string passwrod){try{bool status = SPClaimsUtility.AuthenticateFormsUser(Request.Url, username, passwrod);if (!status){ltError.Text = "用户名或密码错误,请重新输入!";}else{if (Request.QueryString["ReturnUrl"] != null && Request.QueryString["ReturnUrl"] != ""){Response.Redirect(Request.QueryString["ReturnUrl"]);}else if (Request.QueryString["Source"] != null && Request.QueryString["Source"] != ""){Response.Redirect(Request.QueryString["Source"]);}else{Response.Redirect("~/");}}}catch (Exception ex){ltError.Text = "系统错误:<br />";ltError.Text = ex.Message;}}}
}

 

以上就是大致的步骤。PS:在搜索添加SharePoint用户的时候,无法显示成名称,只能显示登录名,还不知道如何解决。

参考资料

转载于:https://www.cnblogs.com/justinliu/p/5961690.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小狐狸ChatGPT系统 不同老版本升级至新版数据库结构同步教程

最新版2.6.7下载&#xff1a;https://download.csdn.net/download/mo3408/88656497 小狐狸GPT付费体验系统如何升级&#xff0c;该系统更新比较频繁&#xff0c;也造成了特别有用户数据情况下升级时麻烦&#xff0c;特别针对会员关心的问题出一篇操作教程&#xff0c;本次教程…

HDUOJ---1754 I Hate It (线段树之单点更新查区间最大值)

I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 33469 Accepted Submission(s): 13168 Problem Description很多学校流行一种比较的习惯。老师们很喜欢询问&#xff0c;从某某到某某当中&#xff0c;…

C# 把数字转换成链表

例如&#xff1a;123456转换成 1 -> 2 -> 3-> 4-> 5-> 6 View Code static LinkedList<int> CovertIntToLinkedList(int num){Stack<int> stack new Stack<int>();LinkedList<int> result new LinkedList<int>();while (num!0…

《MySQL 8.0.22执行器源码分析(4.1)Item_sum类以及聚合》

Item_sum类用于SQL聚合函数的特殊表达式基类。 这些表达式是在聚合函数&#xff08;sum、max&#xff09;等帮助下形成的。item_sum类也是window函数的基类。 聚合函数&#xff08;Aggregate Function&#xff09;实现的大部分代码在item_sum.h和item_sum.cc 聚合函数限制 不…

Java 性能优化实战记录(2)---句柄泄漏和监控

前言: Java不存在内存泄漏, 但存在过期引用以及资源泄漏. (个人看法, 请大牛指正) 这边对文件句柄泄漏的场景进行下模拟, 并对此做下简单的分析.如下代码为模拟一个服务进程, 忽略了句柄关闭, 造成不能继续正常服务的小场景. 1 public class FileHandleLeakExample {2 3 p…

骑士游历问题问题_骑士步行问题

骑士游历问题问题Problem Statement: 问题陈述&#xff1a; There is a chessboard of size NM and starting position (sx, sy) and destination position (dx,dy). You have to find out how many minimum numbers of moves a knight goes to that destination position? 有…

Android基础之用Eclipse搭建Android开发环境和创建第一个Android项目(Windows平台)...

一、搭建Android开发环境 准备工作&#xff1a;下载Eclipse、JDK、Android SDK、ADT插件 下载地址&#xff1a;Eclipse:http://www.eclipse.org/downloads/ JDK&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/jdk7u9-downloads-1859576.html Android SD…

《dp补卡——01背包问题》

目录01背包[416. 分割等和子集](https://leetcode-cn.com/problems/partition-equal-subset-sum/)[1049. 最后一块石头的重量 II](https://leetcode-cn.com/problems/last-stone-weight-ii/)[494. 目标和](https://leetcode-cn.com/problems/target-sum/)01背包 1、dp数组以及…

用JavaScript往DIV动态添加内容

参考&#xff1a;http://zhidao.baidu.com/link?url6jSchyqPiEYCBoKdOmv52YHz9r7MTBms2pK1N6ptOX1kaR2eg320mlW1Sr6n36hpOeOadBxC2rWWGuhZPbms-K <div id"show"></div>要填充的数据为: 这是一个测试例子.jquery&#xff1a;$(function(){ var data …

《dp补卡——完全背包问题》

N件物品和一个最多能背重量为W的背包。第i件物品的重量为weight[i]&#xff0c;得到的价值是value[i]。每件物品都有无限个(可以放入背包多次)&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 01背包和完全背包唯一不同在于遍历顺序上。 01背包的核心代码&#xff1a…

《dp补卡——多重背包》

多重背包简介&#xff1a; 有N种物品和一个容量为V的背包。第i种物品最多有Mi件可用&#xff0c;每件耗费的空间为Ci&#xff0c;价值为Wi。求解将哪些物品装入背包可使得这些物品耗费的空间总和不超过背包容量&#xff0c;且价值总和最大。 将Mi件摊开&#xff0c;就是一个01背…

CocoaAsyncSocket 套接字

CocoaAsyncSocket 套接字 https://github.com/robbiehanson/CocoaAsyncSocket Asynchronous socket networking library for Mac and iOS 用于iOS以及Mac的异步套接字网络库。 TCP GCDAsyncSocket and AsyncSocket are TCP/IP socket networking libraries. Here are the key…

谷歌浏览器设置缓存方法

谷歌浏览器设置缓存方法&#xff1a; 1、在桌面Google Chrome快捷方式&#xff0c;目标&#xff1a;找到 C:\Users\Splendid\AppData\Local\…\Application\chrome.exe 在这后面加上-Disk-Cache-Dir”Z:\TEMP” 注意: -Disk前面有空格&#xff0c;”Z:\TEMP” 是文件存放在Z盘T…

《dp补卡——子序列问题》

目录300. 最长递增子序列674. 最长连续递增序列718. 最长重复子数组1143. 最长公共子序列53. 最大子序和392. 判断子序列115. 不同的子序列583. 两个字符串的删除操作72. 编辑距离647. 回文子串 &#xff08;与 5.最长回文子串思路差不多&#xff09;516. 最长回文子序列300. 最…

《leetcode : 647. 回文子串 思考分析双指针解法》

647. 回文子串 如何确定是回文串&#xff1a; 找中心然后往两边扩散&#xff0c;判断是否对称即可。 在遍历中心点的时候&#xff0c;注意中心点可以是一个元素也可以是两个元素。 class Solution { public:int cal_two_extend(const string& s,int i,int j,int n){int re…

explain用法

explain用法 EXPLAIN SELECT …… 变体&#xff1a; 1. EXPLAIN EXTENDED SELECT …… 将执行计划“反编译”成SELECT语句&#xff0c;运行SHOW WARNINGS 可得到被MySQL优化器优化后的查询语句 2. EXPLAIN PARTITIONS SELECT …… 用于分区表的EXPLAIN 执行计划包含的信息 id…

转:Google论文之三----MapReduce

文章来自于&#xff1a;http://www.cnblogs.com/geekma/p/3139823.html MapReduce&#xff1a;大型集群上的简单数据处理 摘要 MapReduce是一个设计模型&#xff0c;也是一个处理和产生海量数据的一个相关实现。用户指定一个用于处理一个键值&#xff08;key-value&#xff09;…

《DBNotes:Join算法的前世今生》

目录NestLoopJoin算法Simple Nested-Loop JoinIndex Nested-Loop JoinBlock Nested-Loop JoinBatched Key AccessHash Join算法In-Memory Join(CHJ)On-Disk Hash Join参考链接在8.0.18之前&#xff0c;MySQL只支持NestLoopJoin算法&#xff0c;最简单的就是Simple NestLoop Joi…

UNITY3D与iOS交互解决方案

原地址&#xff1a;http://bbs.18183.com/thread-456979-1-1.html 本帖最后由 啊,将进酒 于 2014-2-27 11:17 编辑 “授人以鱼&#xff0c;不如授人以渔”&#xff0c;以UNITY3D调用iOS版的91SDK为例&#xff0c;利用C# / C / OBJ-C交互原理,本文将详细介绍UNITY3D与iOS之间交互…

AP in R

AP聚类算法是目前十分火的一种聚类算法&#xff0c;它解决了传统的聚类算法的很多问题。不仅简单&#xff0c;而且聚类效果还不错。这里&#xff0c;把前两天学习的AP算法在R语言上面的模拟&#xff0c;将个人笔记拿出来与大家分享一下&#xff0c;不谈AP算法的原理&#xff0c…