前几天网上搜索了好久的文章,整理下MVC Authorize关于Roles,Users的权限
基于上一篇OAuth四种授权模式的实现
地址:https://mp.youkuaiyun.com/postedit/102814687
1.在API项目的 Global.asax.cs中,初始化构造方法,添加授权请求初始角色,用户方法
//构造方法
public WebApiApplication()
{
AuthenticateRequest += WebApiApplication_AuthenticateRequest;
}
//授权请求初始化角色,用户
private void WebApiApplication_AuthenticateRequest(object sender, EventArgs e)
{
HttpCookie authcookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authcookie == null || authcookie.Value == "")
return;
FormsAuthenticationTicket authticket = null;
try
{
authticket = FormsAuthentication.Decrypt(authcookie.Value);
}
catch (Exception)
{
return;
}
/*
Authorize(Users="A,B,C")
该用户校验,基于token生成的Identity的Name匹配,
例:var identity = new ClaimsIdentity(new GenericIdentity(context.ClientId,context.Options.AuthenticationType));
Authorize(Roles="A,B,C")
角色校验基于登陆时写入的UserData
*/
//Authorize(Roles="111,2222")
string[] roles = authticket.UserData.Split(new char[] { ',' });
if (Context.User != null)
//identity中存放的是users信息,roles是对应的roles信息
Context.User = new System.Security.Principal.GenericPrincipal(Context.User.Identity, roles);
}
上面的方法步骤完成后就可以实现角色用户权限校验,接下来配置请求的角色,用户
2.在上一篇中讲到了MyOAuthAuthorizationServeProvider基于OAuthAuthorizationServerProvider的实现,参照密码模式段代码
图中标记的就是用户身份Name,对应授权特性中的Users。
角色的定义一般可以在登陆时赋予,这里我们在自己的控制器中写一个Login方法,用于定义角色。
[AllowAnonymous]
public JsonResult Login()
{
#region
//admin参数对应管理员权限,多个权限可以"A,B,C,D"
FormsAuthenticationTicket authticket = new FormsAuthenticationTicket(
1, "ticket1", DateTime.Now, DateTime.Now.AddMinutes(20), false, "admin"
);
string encryredticket = FormsAuthentication.Encrypt(authticket);
HttpCookie authcookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryredticket);
//将信息写入到请求的cookie中
HttpContext.Response.Cookies.Add(authcookie);
#endregion
return JsonOK("登陆成功");
}
3.写一个测试Controller
public class MyController:Controller
{
public JsonResult JsonOK(object o)
{
return Json(JsonConvert.SerializeObject(o), JsonRequestBehavior.AllowGet);
}
}
public class RoleController : MyController
{
// GET: Role
public JsonResult Index()
{
return JsonOK("No Role,No User");
}
[Authorize(Roles ="admin",Users ="Alis")]
public JsonResult Role1()
{
return JsonOK("Role-admin;user-alis");
}
[Authorize(Roles ="admin")]
public JsonResult Role2()
{
return JsonOK("role-admin");
}
[Authorize(Roles = "admin,source")]
public JsonResult Role3()
{
return JsonOK("role-admin,source");
}
[Authorize(Users ="C1,Alis")]
public JsonResult RoleClient2()
{
return JsonOK("RoleClient2");
}
}
因为也是刚刚学习这块,有理解不对的地方希望大家多多指教!!相互学习