C# 如何开发接受登录或令牌的自定义属性?
在我的MVC 5应用程序中,我将控制器装饰如下:C# 如何开发接受登录或令牌的自定义属性?,c#,asp.net-mvc-5,authorization,custom-attributes,C#,Asp.net Mvc 5,Authorization,Custom Attributes,在我的MVC 5应用程序中,我将控制器装饰如下: [Authorize] public class Controller { .. 然而,我的一个要求是使用令牌来授权操作,而无需进入登录屏幕。ie:http://{website}/Action?令牌={/*此用户的令牌*/} 因此,如何开发接受登录(默认行为)或令牌(自定义、必需行为)的自定义属性? 换句话说,如果我使用http://{website}/Action,我将被重定向到登录屏幕(如果我未被授权),但是如果我使用http://{
[Authorize]
public class Controller
{
..
然而,我的一个要求是使用令牌来授权操作,而无需进入登录屏幕。ie:http://{website}/Action?令牌={/*此用户的令牌*/}
因此,如何开发接受登录(默认行为)或令牌(自定义、必需行为)的自定义属性?
换句话说,如果我使用http://{website}/Action
,我将被重定向到登录屏幕(如果我未被授权),但是如果我使用http://{website}/Action?token={/*此用户的token*/}
,我将被授权并重定向到所述操作
[TokenAuthorize]
类
public class TokenAuthorize : AuthorizeAttribute
{
private const string SecureToken = "token";
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (Authorize(filterContext))
{
return;
}
HandleUnauthorizedRequest(filterContext);
}
private bool Authorize(AuthorizationContext actionContext)
{
try
{
HttpRequestBase request = actionContext.RequestContext.HttpContext.Request;
string token = request.Params[SecureToken];
return SecurityManager.IsTokenValid(token);
}
catch (Exception)
{
return false;
}
}
}
如果我用以下材料装饰控制器:
[Authorize]
[TokenAuthorize]
public class Controller
{
..
它被处理为
Authorize
和TokenAuthorize
。我需要开发一种处理方法,例如授权
或令牌授权
如果不存在令牌,只使用令牌授权
进行装饰,然后返回默认行为如何
TokenAuthorize.cs
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
bool isTokenAuthorized = HasValidToken(...);
if(isTokenAuthorized) return true;
bool isDefaultAuthorized = base.AuthorizeCore(httpContext);
if(isDefaultAuthorized) return true;
return false;
}
[TokenAuthorize]
public class MyController
{
...
}
MyController.cs
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
bool isTokenAuthorized = HasValidToken(...);
if(isTokenAuthorized) return true;
bool isDefaultAuthorized = base.AuthorizeCore(httpContext);
if(isDefaultAuthorized) return true;
return false;
}
[TokenAuthorize]
public class MyController
{
...
}
鞋子让我走上了正确的道路
我执行了他的建议,并在我的授权
功能中执行了以下操作:
private bool Authorize(AuthorizationContext actionContext)
{
try
{
HttpContextBase context = actionContext.RequestContext.HttpContext;
string token = context.Request.Params[SecurityToken];
bool isTokenAuthorized = SecurityManager.IsTokenValid(token);
if (isTokenAuthorized) return true;
bool isDefaultAuthorized = AuthorizeCore(context);
return isDefaultAuthorized;
}
catch (Exception)
{
return false;
}
}
通过使用[TokenAuthorize]
进行装饰,我可以通过登录(默认)或通过令牌来授权操作。完美代码:从DB验证令牌
公共类令牌授权:AuthorizeAttribute
{
字符串连接字符串;
授权时的公共覆盖无效(AuthorizationContext filterContext)
{
if(授权(过滤上下文))
{
返回;
}
HandleUnauthorizedRequest(filterContext);
}
受保护的bool授权(AuthorizationContext httpContext)
{
bool isTokenAuthorized=HasValidToken();
如果(i)返回true;
返回false;
}
受保护的bool HasValidToken()
{
string-token=string.Empty;
token=HttpContext.Current.Request.Params[“token”];
_connectionString=WebConfiguration Manager.connectionString[“SqlConnectionString”]。connectionString;
SqlTransaction txn=null;
使用(SqlConnection conn=newsqlconnection(_connectionString))
{
conn.Open();
txn=conn.BeginTransaction();
列表参数=新列表();
SqlParameter参数=新的SqlParameter();
添加(新的SqlParameter(“@token”,token));
参数=新的SqlParameter(“@return\u ops”,0);
parameter.Direction=ParameterDirection.Output;
参数。添加(参数);
SqlHelper.ExecuteNonQuery(txn,CommandType.storedProcess,“[master_LoggedInUsers]”,parameters.ToArray());
int result=Convert.ToInt32(参数[1].Value);
如果(结果)