【问题标题】:Web Api 2 Basic Auth Generic Principal Not SetWeb Api 2 基本身份验证通用主体未设置
【发布时间】:2013-10-27 00:21:10
【问题描述】:

我有以下代码来设置通用主体。

public class AuthenticationHandler: DelegatingHandler
{
    protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
                                                                                  CancellationToken cancellationToken)
    {
        var accessToken = request.Headers.Authorization;
        if (accessToken == null)
            return base.SendAsync(request, cancellationToken);

        // Catch an error with regards to the accessToken being invalid
        try
        {
            var formsAuthenticationTicket = FormsAuthentication.Decrypt(accessToken.Parameter);

            if (formsAuthenticationTicket == null)
                return base.SendAsync(request, cancellationToken);

            var data = formsAuthenticationTicket.UserData;
            var userData = JsonConvert.DeserializeObject<LoginRoleViewModel>(data);

            var identity = new GenericIdentity(userData.Id.ToString(), "Basic");

            var userRole = userData.Roles.ToArray();
            var principal = new GenericPrincipal(identity, userRole);
            Thread.CurrentPrincipal = principal;
            HttpContext.Current.User = principal;

        }
        catch (Exception ex)
        {
            var responseMessage = request.CreateResponse(HttpStatusCode.BadRequest, new { ex.Message }); // return ex for full stacktrace
            return Task<HttpResponseMessage>.Factory.StartNew(() => responseMessage);
        }

        return base.SendAsync(request, cancellationToken);
    }

}

以下是控制器示例

[Authorize(Roles = "Administrator, Customers")]
[HttpGet("customers/{id}")]
public CustomerViewModel GetCustomer(string id)
{
    var param = AuthService.CheckPermission(Request, User, id);
    var customer = Db.Customers.Find(param);
    return Mapper.Map<CustomerViewModel>(customer);
}

这是我检查用户角色的地方

public int CheckPermission(HttpRequestMessage request, IPrincipal user, string param)
{
    if (user.IsInRole("Customers") || user.IsInRole("Dealerships"))
    {
        if (param == null || param != "me")
            throw new HttpResponseException(request.CreateErrorResponse(HttpStatusCode.Forbidden, "unauthorized request"));
        param = user.Identity.Name;
    }

    return Convert.ToInt32(param);
}

这在升级到 Web Api 2 和 MVC 5 之前运行良好?现在用户没有角色或身份,有什么我不知道的变化吗?

【问题讨论】:

    标签: c# authentication asp.net-web-api


    【解决方案1】:

    不知道为什么它不再工作了,但是在 Web API 2 中,有一个新的类 HttpRequestContext 具有 Principal 属性,并且是您应该设置以更新 Principal。您可以从请求中访问上下文对象。

    【讨论】:

    • 这是我从 WebApi 迁移到 WebApi 2 后的问题
    • 至于他们更改它的原因,是因为从仅 IIS 转向也支持 OWIN。见:brockallen.com/2013/10/27/…
    【解决方案2】:

    真的不确定为什么这个功能在经过多年的稳定之后发生了变化。

    我们找到了以下作品

    request.GetRequestContext().Principal = new GenericIdentity(userData.Id.ToString(), "Basic");
    

    这也有效,而且 IMO 更美观,因为您没有设置函数的成员

    HttpContext.Current.User = new GenericIdentity(userData.Id.ToString(), "Basic");
    

    【讨论】:

    • 这非常有用。感谢您发布此信息。这不是我所做的。我会在下面发帖。
    【解决方案3】:

    这就是我为使其正常工作所做的。不幸的是升级导致了这个问题。

    var identity = new GenericIdentity("ApiUser", request.Headers.Authorization.Scheme);
    var principal = new GenericPrincipal(identity, new string[0]);                            
    request.GetRequestContext().Principal = principal;
    

    【讨论】:

      【解决方案4】:

      将“基本”改为“表单”

      var identity = new GenericIdentity(userData.Id.ToString(), "Forms");
      

      此外,您使用的是 FormsAuthenticationModule 吗? MVC5 通过这个模块支持表单认证。检查此处给出的示例 http://msdn.microsoft.com/en-us/library/system.web.security.formsauthenticationmodule.aspx

      建议使用 FormsAuthentication_OnAuthenticate 进行描述和分配身份。

      同时查看http://blogs.msdn.com/b/webdev/archive/2013/07/03/understanding-owin-forms-authentication-in-mvc-5.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-03
        • 2014-01-28
        • 2013-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-04
        • 2021-10-13
        相关资源
        最近更新 更多