gpt4 book ai didi

asp.net - 如何在其他 Controller 中使用授权用户名

转载 作者:行者123 更新时间:2023-12-04 05:42:18 24 4
gpt4 key购买 nike

使用基本身份验证和 asp.net Web-Api,其中 JSON 获取/发布到我的 API,我需要检查用户名/密码是否存在于成员资格表中。下面的代码是做什么的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Security;

namespace MvcApplication4.Filter
{
public class BasicAuthenticationAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
if (actionContext.Request.Headers.Authorization == null)
{
actionContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
}
else
{
string authToken = actionContext.Request.Headers.Authorization.Parameter;
string decodedToken = Encoding.UTF8.GetString(Convert.FromBase64String(authToken));
string username = decodedToken.Substring(0, decodedToken.IndexOf(":"));
string password = decodedToken.Substring(decodedToken.IndexOf(":") + 1);

if (Membership.Provider.ValidateUser(username, password))
{
// User exists in the membership table
}
else
{
// User doesn't exist - so return Unathorized
actionContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
}
}
}
}
}

我需要在我的其他 Controller 中引用用户名,以确保用户名也存在于查找表中,该表说明允许用户查询哪些汽车。我的数据库中有一个表,以及一个相关的类:
public class ApiMembers
{
public int id { get; set; }
public string UserName { get; set; }
public int car_id { get; set; }
}


[BasicAuthentication]
public IEnumerable<Cars> GetCars(long id)
{
var auth = dba.ApiMembers.Select(a => a.car_id == id && a.UserName=***AuthorisedUserName***).FirstOrDefault();
if (auth == null || !auth.Any())
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Unauthorized));
}
else
{
// User exists in table, so give them info on car
}

我的问题是,无需再次读取 HTTP header ,如何将 UserName 放入 授权用户名 部分?有没有办法在 BasicAuthentication 过滤器中“登录”用户,或者你可以使用 session 变量,比如在 webforms 中?或者有没有更好的方法来了解谁已经在其他 Controller 中进行了身份验证?

最佳答案

您可以设置当前主体:

if (Membership.Provider.ValidateUser(username, password))
{
// User exists in the membership table
var identity = new GenericIdentity(username);
Thread.CurrentPrincipal = new GenericPrincipal(identity, null);
}

现在在你的 ApiController 中你可以使用 User属性来访问当前连接的用户名(注意这个属性是在 ASP.NET MVC 4 RC 中添加的 - 在以前的版本中你可以使用 Request.GetPrincipal 扩展方法)。
[BasicAuthentication]
public HttpResponseMessage Get()
{
string username = User.Identity.Name;

...
}

关于asp.net - 如何在其他 Controller 中使用授权用户名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11135473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com